Python 分析80GB文件中仅32GB内存的巨大数据集
我有非常大的文本文件(大约80G)。该文件只包含数字(整数+浮点数),有20列。现在我要分析每一列。通过分析,我的意思是,我必须对每一列做一些基本的计算,比如找到平均值,绘制直方图,检查条件是否满足等等。我正在阅读如下文件Python 分析80GB文件中仅32GB内存的巨大数据集,python,arrays,plot,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
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)来执行我的程序。问题是我不能完成我的工作。我等了差不多一天才完成那个程序,但一天后它仍在运行。后来我不得不手动杀死它。我知道我的脚本是正确的,没有任何错误,因为我在较小大小的文件(大约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
我已经在一堆较小的文件上测试了上述代码,效果很好。然而,当我在大文件上使用时,又出现了同样的问题。有什么建议吗?还有其他更干净的方法吗?对于这样长的操作(当数据不适合内存时),使用诸如dask()之类的库,特别是
dask.dataframe.read_csv
来读取数据,然后像在pandas库中一样执行操作可能会很有用(要提及的另一个有用的包)
-
<>你应该考虑用进行计算。
在计算机科学中,在线算法是一种能够以串行方式逐段处理输入的算法,即按照输入到算法的顺序处理输入,而不必从一开始就提供整个输入
通过这种方式,可以以恒定的内存复杂度计算并使用预先指定的存储箱
- 您应该将数据放入适当的数据库,并利用该数据库系统的统计和数据处理功能,例如,和
随机链接:
- 您应该将数据放入适当的数据库,并利用该数据库系统的统计和数据处理功能,例如,和
随机链接:
- 我想到了两种选择:
-
<>你应该考虑用进行计算。
在计算机科学中,在线算法是一种能够以串行方式逐段处理输入的算法,即按照输入到算法的顺序处理输入,而不必从一开始就提供整个输入
通过这种方式,可以以恒定的内存复杂度计算并使用预先指定的存储箱
hist
,则无需将所有80G
数据保留在内存中。hist
只是一个示例。我还需要做其他的计算,比如找到平均值,搜索特定的值/条件等,我想说的是,您应该弄清楚是否需要在内存中保留所有80G
数据来进行此类计算?大多数情况下,我需要检查值是否高于或低于阈值,并生成带有两列或更多列的hist
或scatter
。我不知道这是否需要全部80克。然而,即使我不想在内存中保留80G,我如何实现这一点?以hist
为例,您只需要关心指定数字的出现。因此,不需要在内存中存储指定数量的所有副本,您只需要一个副本和出现的次数。好吧,这只是一个例子。如果您只需要获取一个hist
,那么就不需要将所有80G
数据保存在内存中。hist
只是一个例子。我还需要做其他的计算,比如找到平均值,搜索特定的值/条件等,我想说的是,您应该弄清楚是否需要在内存中保留所有80G
数据来进行此类计算?大多数情况下,我需要检查值是否高于或低于阈值,并生成带有两列或更多列的hist
或scatter
。我不知道这是否需要全部80克。然而,即使我不想在内存中保留80G,我如何实现这一点?以hist
为例,您只需要关心指定数字的出现。因此,不需要在内存中存储指定数量的所有副本,您只需要一个副本和出现的次数。嗯,这只是一个例子。是的,我的朋友很少建议我去熊猫图书馆。我试着跟帖。这项分析正在进行中。尚未成功,代码中存在一些错误。不过我不知道dask的事。我去看看。Thanksdak在提供相同的API的同时,使用了一些“魔法”对数据进行分块操作。但是,并非所有方法都已移植,请注意!是的,我的朋友中很少有人建议我去熊猫图书馆。我试着跟帖。这项分析正在进行中。尚未成功,代码中存在一些错误。不过我不知道dask的事。我去看看。Thanksdak在提供相同的API的同时,使用了一些“魔法”对数据进行分块操作。但是,并非所有方法都已移植,请注意!