python - 仅使用 32GB 内存分析 80GB 文件中的庞大数据集

标签 python arrays plot

我有非常大的文本文件(大约 80G)。文件仅包含数字(整数+ float )并且有 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

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

最佳答案

对于如此冗长的操作(当数据不适合内存时),使用像 dask ( http://dask.pydata.org/en/latest/ ) 这样的库可能很有用,尤其是 dask.dataframe.read_csv 来读取数据,然后像在 pandas 库(另一个值得一提的有用包)中那样执行您的操作。

关于python - 仅使用 32GB 内存分析 80GB 文件中的庞大数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32861069/

相关文章:

java - Java 中的数组创建语法

matlab - 将变换应用到等值面的面/顶点并绘制结果

animation - 使用 Octave 制作轨迹动画

python - 如果 SFTP 服务器触发在上传时自动移动文件,Paramiko put 方法会抛出 "[Errno 2] File not found"

python - 什么时候需要 pygame.init()?

python - 在 Python 中动态分配函数实现

c++ - 使用 for 循环反转数组什么都不做

python - 在 Python 中作为函数调用时,Eratosthenes 筛法要慢得多

php - 如何使用ajax将数组从html传递到php

将 float(x) 舍入到最近的 .5 即 > x