我有非常庞大的文本文件(大约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
我已经在一堆较小的文件上测试了上面的代码,它工作正常。然而,当我在大文件上使用时,同样的问题。有什么建议?还有其他更清洁的方法吗?
答案 0 :(得分:2)
对于如此冗长的操作(当数据不适合内存时),使用dask(http://dask.pydata.org/en/latest/)等库,尤其是dask.dataframe.read_csv
来读取数据,然后执行像你在pandas库中所做的操作(另一个有用的包)。
答案 1 :(得分:2)
我想到了两个选择:
您应该考虑按online algorithms
执行计算在计算机科学中,在线算法是一种能够以串行方式逐个处理其输入的算法,即按照输入馈送到算法的顺序,而不需要从一开始就提供整个输入
可以使用预先指定的分区计算mean and variance和histogram,并且内存复杂程度不变。
您应该将数据放入适当的数据库,并利用该数据库系统的统计和数据处理功能,例如aggregate functions和indexes。
随机链接: