Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 分析80GB文件中仅32GB内存的巨大数据集_Python_Arrays_Plot - Fatal编程技术网

Python 分析80GB文件中仅32GB内存的巨大数据集

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

我有非常大的文本文件(大约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)来执行我的程序。问题是我不能完成我的工作。我等了差不多一天才完成那个程序,但一天后它仍在运行。后来我不得不手动杀死它。我知道我的脚本是正确的,没有任何错误,因为我在较小大小的文件(大约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的同时,使用了一些“魔法”对数据进行分块操作。但是,并非所有方法都已移植,请注意!