分析80GB文件中的大数据集,只有32GB的RAM

时间:2015-09-30 08:11:01

标签: python arrays plot

我有非常庞大的文本文件(大约80G)。文件只包含数字(整数+浮点数),有20列。现在我必须分析每一列。通过分析我的意思是,我必须对每一列进行一些基本的计算,比如找到平均值,绘制直方图,检查条件是否满足等。我正在阅读文件如下

with open(filename) as original_file:
        all_rows = [[float(digit) for digit in line.split()] for line in original_file]
    all_rows = np.asarray(all_rows)

在此之后,我对特定列进行了所有分析。我用'好''配置服务器/工作站(带32GB RAM)来执行我的程序。问题是我无法完成我的工作。我等了差不多一天才完成那个程序但是它在1天后仍在运行。我不得不稍后手动杀死它。我知道我的脚本是正确的,没有任何错误,因为我在较小的文件(大约1G)上尝试了相同的脚本,并且它工作得很好。

我最初的猜测是它会有一些内存问题。我有什么办法可以办这样的工作吗?一些不同的方法或其他方式?

我尝试将文件拆分为较小的文件大小,然后在循环中单独分析它们,如下所示

pre_name = "split_file"   
for k in range(11):  #There are 10 files with almost 8G each
        filename = pre_name+str(k).zfill(3) #My files are in form "split_file000, split_file001 ..."
        with open(filename) as original_file:
            all_rows = [[float(digit) for digit in line.split()] for line in original_file]
        all_rows = np.asarray(all_rows)
        #Some analysis here
        plt.hist(all_rows[:,8],100)  #Plotting histogram for 9th Column
all_rows = None

我已经在一堆较小的文件上测试了上面的代码,它工作正常。然而,当我在大文件上使用时,同样的问题。有什么建议?还有其他更清洁的方法吗?

2 个答案:

答案 0 :(得分:2)

对于如此冗长的操作(当数据不适合内存时),使用dask(http://dask.pydata.org/en/latest/)等库,尤其是dask.dataframe.read_csv来读取数据,然后执行像你在pandas库中所做的操作(另一个有用的包)。

答案 1 :(得分:2)

我想到了两个选择: