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

时间:2015-06-23 22:42:56

标签: python object large-file-upload

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

我的脚本有两个功能,一个用于加载数据集,另一个用于使用所述数据训练随机森林模型。这些都工作正常,但文件上传需要大约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作为标签和cols。 12-end作为训练随机森林的元数据。

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

4 个答案:

答案 0 :(得分:1)

如果我理解正确,数据集不会改变,但模型参数会发生变化,并且每次运行后都会更改参数。

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

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

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

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

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

答案 1 :(得分:0)

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

_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 :(得分:0)

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

答案 3 :(得分:0)

在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脚本时,您无需多次加载数据。