簡體   English   中英

大型數據集的統計/分布

[英]Statistics / distributions over very large data sets

看一下有關數據文件中簡單統計信息的討論,我想知道這些技術中的哪一種最適合在非常大的數據集(〜數百萬個條目,千兆字節的數據)上擴展。

將整個數據集讀入內存的numpy解決方案在這里合適嗎? 看到:

在Python中合並頻率分布

您並沒有告訴您擁有哪種數據以及要計算什么!

如果您將某物轉換為或容易轉換為中等大小的正整數(例如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。)

當然,您可能需要計算其他一些統計信息(標准偏差等),但是即使那樣,您通常也可以使用分布(直方圖)來計算該統計信息。 但是,如果不需要分發,則可能會有更快的方法。 計算平均值與將所有值加在一起的方法相同。

如果您有文本文件,則主要挑戰在於逐塊分析文件。 對於很大的文件,標准方法loadtxtcsv模塊不一定非常有效。

如果您有浮點數或非常大的整數,則上述方法無法直接使用,但是在某些情況下,您可能只使用FP數的某些位或將內容四舍五入為最接近的整數,等等。在任何情況下,問題都歸結為您真正擁有的數據類型以及要計算的統計數據。 沒有瑞士刀可以解決龐大文件的所有統計問題。

如果您有足夠的內存,將數據讀入內存是一個很好的選擇。 在某些情況下,您可以在沒有足夠內存的情況下執行此操作(使用numpy.memmap )。 如果您的文本文件具有1 GB的浮點數,則最終結果可能不足1 GB,並且大多數計算機都可以很好地處理該結果。 只要確保您使用的是64位Python。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM