2011-05-11 17 views
1

我有一段代碼,它在每次迭代中生成相當大的列表。爲了節省內存,我想在列表生成後,在每次迭代中將每個列表寫入二進制文件。 我試過這個文本文件(甚至在linux中將參數設置爲「wb」)。 「wb」似乎對用二進制或文本格式寫入的文件沒有任何影響。此外,書面文件是巨大的,我不想這樣。我相信如果我可以用二進制格式寫這些列表,這個文件將會小得多。 謝謝如何將「逐個」列表寫入Python中的二進制文件?

+1

什麼類型列表項目?正在使用NumPy一個選項? – 2011-05-11 15:03:51

+3

沒有「[二進制格式]」這樣的東西。有些格式在任何編碼中都不像文本(分別不應該)。然而,這裏有很多這樣的格式和無數可能的格式。 **你想要什麼**二進制格式? – delnan 2011-05-11 15:07:32

+0

@Sven:最終這個列表將作爲特徵向量輸入到分類器 – Hossein 2011-05-12 08:27:53

回答

4

既然您提到需要壓縮性,我建議使用picklegzip模塊來壓縮輸出。你可以寫,並一次讀回您的名單之一,這裏有一個如何的例子:

import gzip, pickle 

output = gzip.open('pickled.gz', 'wb', compresslevel=9) 

for x in range(10): 
    output.write(pickle.dumps(range(10)) + '\n\n') 
output.close() 

,然後使用一個發電機來產生列表回一個時間:

def unpickler(input): 
    partial = [] 
    for line in input: 
     partial.append(line) 
     if line == '\n': 
      obj = ''.join(partial) 
      partial = [] 
      yield pickle.loads(obj) 

input = gzip.open('pickled.gz', 'rb') 
for l in unpickler(input): 
    print l 

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
+0

@zeekey:感謝你的代碼,但問題在於,正如我所提到的,這個列表的列表將非常大,以適應內存,然後將其寫入文件。我需要按列表編寫列表以避免內存不足。 – Hossein 2011-05-12 08:35:05

+0

您可以使用'\ n \ n'(或類似的東西)一次性轉儲一個醃製對象,以分離記錄。 – zeekay 2011-05-12 08:52:11

+0

@Hossein我添加了一個例子,說明如何一次一個讀/寫列表,希望有所幫助! – zeekay 2011-05-12 09:16:47

1

您可以使用cPickle序列化您的列表並將結果轉儲到文件。

1

'b'標誌更改的唯一情況是如何完成換行以支持Windows。

import pickle 
help(pickle.load) 
help(pickle.dump) 

# seems fairly efficient, taking 200bytes to store [1,2,...,100], 
# 2.7kb to store [1,2,...,1000], 
# and 29kb to store [1,2,...,10000]: 
>>> len(pickle.dumps(list(range(100)))) 
208 
>>> len(pickle.dumps(list(range(1000)))) 
2752 
>>> len(pickle.dumps(list(range(10000)))) 
29770 

#create and store 
data = {} 
data['myList'] = [i for i in range(100)] 
with open('myfile.pickle', 'wb') as f: 
    pickle.dump(data, f) 

# retrieve 
with open('myfile.pickle', 'wb') as f: 
    data2 = pickle.load(f) 
print(data2) 

請注意,在任何用戶提供的數據上使用pickle是不安全的。您將希望以二進制模式打開正在寫入的文件。