的窗口,我在Python新手計算功能。我有一個18 GB和4800萬條記錄的巨大csv文件。每個記錄都是37維矢量,記錄在〜1700Hz。我正在嘗試使用this approach在其上應用滑動窗口。並且對於每個窗口,我正在計算簡單的mean
和variance
。對於較小規模的數據,這很好。但是,一旦我試圖通過我的實際文件計算它,它會花費很長時間。我使用下面的代碼:快速的方式在滑動巨大的csv文件
這code是繼承列表,像deque.maxlen
max_list_size = 3015000 # for samples in 30 mins
sliding_factor = 1005000 # for samples in 10 mins
class L(list):
def append(self, item):
global max_list_size
list.append(self, item)
if len(self) > max_list_size: self[:1]=[]
添加功能,此功能是計算的均值和方差在我的名單
def calc_feature(mylist):
print 'mean is ', numpy.mean(mylist)
print 'variance is ', numpy.var(mylist)
這是閱讀文件和計算功能對於每一個窗口
def read_mycsv (csv_filepath):
global max_list_size, sliding_factor
mylist = L()
with open(csv_filepath,"rb") as f:
reader = csv.reader(f)
for _ in range(max_list_size):
mylist.append(map(float,reader.next())) # filling records in list
try:
while 1:
calc_feature(mylist)
for _ in range(sliding_factor):
mylist.append(map(float,reader.next()))
except StopIteration:
calc_feature(mylist)
對於計算第一個窗口,需要5分鐘來應答均值和方差。但它從未迴應過第二個窗口。我不知道我在做什麼錯。我試圖查看互聯網,但我認爲我找到了錯誤的方向。
編輯
正如@Omada建議我改變了我的數據結構從list
到deque
,現在它正在爲下一個Windows爲好。我認爲在循環中讀取每一行並放入deque
是昂貴的。無論如何要一次讀取文件塊?
你會通過讀取更大的塊中的文件,將那些numpy的陣列,然後計算這些陣列的子集的總結得到這種任務的最佳性能(你會保持在單個存儲單元中的數據通過這個)。 – liborm
@liborm是的,我認爲閱讀一條線需要花費太多時間。我查閱了大量文件,但失敗了。你有沒有與此相關的資源? – Muaz
這不是閱讀,而是分別處理每一行,導致它慢。您可以閱讀說5 MB的數據的時間,然後使用類似[熊貓](http://pandas.pydata.org/pandas-docs/stable/computation.html#moving-rolling-statistics-moments)來計算統計,然後閱讀下一個塊佔重疊,沖洗和重複。 – liborm