[英]Statistics / distributions over very large data sets
看一下有關數據文件中簡單統計信息的討論,我想知道這些技術中的哪一種最適合在非常大的數據集(〜數百萬個條目,千兆字節的數據)上擴展。
將整個數據集讀入內存的numpy解決方案在這里合適嗎? 看到:
您並沒有告訴您擁有哪種數據以及要計算什么!
如果您將某物轉換為或容易轉換為中等大小的正整數(例如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。)
當然,您可能需要計算其他一些統計信息(標准偏差等),但是即使那樣,您通常也可以使用分布(直方圖)來計算該統計信息。 但是,如果不需要分發,則可能會有更快的方法。 計算平均值與將所有值加在一起的方法相同。
如果您有文本文件,則主要挑戰在於逐塊分析文件。 對於很大的文件,標准方法loadtxt
和csv
模塊不一定非常有效。
如果您有浮點數或非常大的整數,則上述方法無法直接使用,但是在某些情況下,您可能只使用FP數的某些位或將內容四舍五入為最接近的整數,等等。在任何情況下,問題都歸結為您真正擁有的數據類型以及要計算的統計數據。 沒有瑞士刀可以解決龐大文件的所有統計問題。
如果您有足夠的內存,將數據讀入內存是一個很好的選擇。 在某些情況下,您可以在沒有足夠內存的情況下執行此操作(使用numpy.memmap
)。 如果您的文本文件具有1 GB的浮點數,則最終結果可能不足1 GB,並且大多數計算機都可以很好地處理該結果。 只要確保您使用的是64位Python。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.