非常大的数据集的统计/分布

时间:2014-08-04 12:24:09

标签: python statistics

从有关数据文件的简单统计数据的讨论中,我想知道哪些技术可以在非常大的数据集上进行扩展(数百万条目,数据为Gbytes)。

numpy解决方案是否将整个数据集读入内存中?参见:

Binning frequency distribution in Python

1 个答案:

答案 0 :(得分: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

速度非常快,速度确实受到磁盘访问的限制。 (我在操作系统缓存中有大约1 GB / s的文件。)

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

如果你有一个文本文件,那么主要的挑战是解析文件chunk-by-chunk。对于非常大的文件,标准方法loadtxtcsv模块不一定非常有效。

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

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