如何避免将大文件重复加载到 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 脚本中?的主要内容,如果未能解决你的问题,请参考以下文章