【问题标题】:Statistics / distributions over very large data sets超大数据集的统计/分布
【发布时间】:2014-08-04 12:24:09
【问题描述】:

查看有关数据文件中的简单统计信息的讨论,我想知道这些技术中的哪一种最适合在非常大的数据集(约数百万个条目,千兆字节的数据)上扩展。

在这里将整个数据集读入内存的 numpy 解决方案是否合适?见:

Binning frequency distribution in Python

【问题讨论】:

    标签: python statistics


    【解决方案1】:

    您并没有告诉您拥有哪种数据以及要计算什么!

    如果你有一些东西可以或很容易转换成中等大小的正整数(例如,0..1e8),你可以使用bincount。下面是一个示例,说明如何对一个非常大的文件中的所有字节的字节值进行分布(直方图)(取决于您的文件系统可以管理的任何内容):

    import numpy as np
    
    # number of bytes to read at a time
    CHUNKSIZE = 100000000
    
    # open the file
    f = open("myfile.dat", "rb")
    
    # cumulative distribution array
    cum = np.zeros(256)
    
    # read through the file chunk by chunk
    while True:
        chunkdata = np.fromstring(f.read(CHUNKSIZE), dtype='uint8')
        cum += np.bincount(chunkdata)
        if len(chunkdata < CHUNKSIZE):
            break
    

    这个速度很快,速度确实受磁盘访问限制。 (我在 OS 缓存中获得了大约 1 GB/s 的文件。)

    当然,您可能想要计算一些其他统计数据(标准差等),但即便如此,您通常也可以使用分布(直方图)来计算该统计数据。但是,如果您不需要分发,那么可能有更快的方法。计算平均值与将所有值相加一样。

    如果您有一个文本文件,那么主要的挑战是逐块解析文件。标准方法loadtxt 和csv 模块对于非常大的文件不一定非常有效。

    如果您有浮点数或非常大的整数,上述方法不能直接使用,但在某些情况下,您可能只使用一些 FP 数位或四舍五入到最接近的整数等。无论如何,问题真的归结为你真正拥有什么样的数据,以及你想要计算什么样的统计数据。没有瑞士刀可以解决大文件的所有统计问题。

    如果你有足够的内存,将数据读入内存是一个很好的选择。在某些情况下,您可以在没有足够内存的情况下执行此操作(使用numpy.memmap)。如果您有一个包含 1 GB 浮点数的文本文件,最终结果可能会小于 1 GB,大多数计算机都可以很好地处理。只需确保您使用的是 64 位 Python。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2021-08-17
      • 2012-08-11
      • 2015-08-08
      • 2022-01-23
      • 2014-05-28
      • 2011-09-27
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多