如何避免将大文件重复加载到 python 脚本中?

Posted

技术标签:

【中文标题】如何避免将大文件重复加载到 python 脚本中?【英文标题】:How to avoid loading a large file into a python script repeatedly? 【发布时间】:2015-09-09 22:58:46 【问题描述】:

我编写了一个 python 脚本来获取一个大文件(一个矩阵 ~50k 行 X ~500 列)并将其用作数据集来训练随机森林模型。

我的脚本有两个功能,一个是加载数据集,另一个是使用所述数据训练随机森林模型。这些都可以正常工作,但是文件上传需要大约 45 秒,每次我想训练一个略有不同的模型(在同一数据集上测试许多模型)时,这样做很痛苦。这是文件上传代码:

def load_train_data(train_file):
    # Read in training file
    train_f = io.open(train_file)
    train_id_list = []
    train_val_list = []
    for line in train_f:
        list_line = line.strip().split("\t")
        if list_line[0] != "Domain":
            train_identifier = list_line[9]
            train_values = list_line[12:]
            train_id_list.append(train_identifier)
            train_val_float = [float(x) for x in train_values]
            train_val_list.append(train_val_float)
    train_f.close()
    train_val_array = np.asarray(train_val_list)

    return(train_id_list,train_val_array)

这将返回一个带有 col 的 numpy 数组。 9 作为标签和列。 12-end 作为元数据来训练随机森林。

我将使用相同的数据训练我的模型的许多不同形式,所以我只想上传一次文件并将其提供给我的随机森林函数。我希望文件成为我认为的对象(我对 python 很陌生)。

【问题讨论】:

我相信如果你在python控制台运行,你可以加载一次文件,然后单独加载其他文件/调用函数,而不必重新加载文件 您必须查看pandas 库以进行数据处理。使用它来操作数据是小菜一碟。如果您以前使用过 R,您将能够很快掌握它。具体来说,您应该查看文档中的 read_xxx 函数,这些函数允许您将不同的文件格式加载到数据帧中。 【参考方案1】:

最简单的方法是缓存结果,如下所示:

_train_data_cache = 
def load_cached_train_data(train_file):
  if train_file not in _train_data_cache:
    _train_data_cache[train_file] = load_train_data(train_file)
  return _train_data_cache[train_file]

【讨论】:

【参考方案2】:

尝试了解 Python 数据序列化。您基本上可以使用 python 的 marshal 函数将大文件存储为特定于 python 的序列化二进制对象。这将大大加快文件的 IO。有关性能变化,请参阅 these 基准。但是,如果这些随机森林模型都是同时训练的,那么您可以针对内存中已有的数据集对其进行训练,然后在完成后发布训练数据。

【讨论】:

【参考方案3】:

如果我理解正确,数据集不会改变,但模型参数会改变,而且每次运行后你都会改变参数。

我会将文件加载脚本放在一个文件中,然后在 python 解释器中运行它。然后该文件将使用您使用的任何变量加载并保存在内存中。

然后您可以使用模型代码导入另一个文件,并以训练数据作为参数运行该文件。

如果您的所有模型更改都可以确定为函数调用中的参数,那么您只需导入模型,然后使用不同的参数设置调用训练函数。

如果您需要在运行之间更改模型代码,请使用新文件名保存并导入该文件,再次运行并将源数据发送到该文件。

如果您不想使用新文件名保存每个模型修改,您可能可以根据 python 版本使用重新加载功能,但不建议这样做(请参阅Proper way to reload a python module from the console)

【讨论】:

【参考方案4】:

在 ipython 中加载您的数据。

my_data = open("data.txt")

在 python 脚本中编写代码,例如 example.py,它使用这些数据。在脚本 example.py 的顶部添加以下行:

import sys

args = sys.argv

data = args[1]
...

现在在 ipython 中运行 python 脚本:

%run example.py $mydata

现在,在运行您的 python 脚本时,您不需要多次加载数据。

【讨论】:

以上是关于如何避免将大文件重复加载到 python 脚本中?的主要内容,如果未能解决你的问题,请参考以下文章

将大制表符分隔文件读入R [重复]

如何将大文件加载到分块的 Adonis JS 中?

如何有效地将大文件加载到 IndexedDB 存储中?我的应用程序在超过 100,000 行时崩溃

在csv文件中写入字符串时,如何避免重复字符串?

将大 csv 文件中的小随机样本加载到 R 数据框中

在未加载重复项的多个 python 脚本之间共享变量(来自文件的数据)