2016-05-24 71 views
0

考慮以下Python代碼Python中使用的磁盤空間,而不是RAM由沒有足夠的RAM

with open(sys.argv[2], 'r') as fin, \ 
      open(sys.argv[3], 'w') as fout: 
     reader = csv.DictReader(fin, delimiter='%s' % sys.argv[4]) 
     writer = csv.DictWriter(fout, reader.fieldnames, dialect='excel') 
     writer.writeheader() 
     writer.writerows(reader) 

讓我們假設我們有大約2GB的大文件作爲輸入,我們的系統只具有512MB的RAM,這可能會導致錯誤Memory Usage

有沒有辦法讓我的代碼使用磁盤空間而不是內存,即使這會讓它變慢?或者這是一個操作系統的問題,應該添加更多的交換爲例?

更新

上面的代碼只是一個例子

考慮這個〔實施例

with io.open(sys.argv[2], 'r', encoding='utf8', errors='ignore') as fin, \ 
    io.open(sys.argv[3], 'w', encoding='utf8', errors='ignore') as fout: 
    rows = csv.DictReader(fin, delimiter='%s' % sys.argv[4]) 
    fout.write(json.dumps(list(rows), indent=4)) 
使用 json.dumps你總是需要一次寫入數據,而如果要追加時

文件,您必須讀取文件並附加數據並寫入文件,如下所示:

data = readjson(jsonfile) 
data.append(newentry) 
jsonfile.write(json.dumps(data)) 

更新2使用發電機(懶進化)

我來到這個想法,但我不知道這是否有差別

def gen(list): 
    for e in list: 
     yield e 

with open(sys.argv[2], 'r') as fin, \ 
      open(sys.argv[3], 'w') as fout: 
     reader = csv.DictReader(fin, delimiter='%s' % sys.argv[4]) 
     writer = csv.DictWriter(fout, reader.fieldnames, dialect='excel') 
     writer.writeheader() 
     writer.writerows(gen(reader)) 

with open(sys.argv[2], 'r') as fin, \ 
    open(sys.argv[3], 'w') as fout: 
    rows = csv.DictReader(fin, delimiter='%s' % sys.argv[4]) 
    # fout.write(json.dumps(gen(rows), indent=4)) -> cause error <generator object gen at 0x025BDDA0> is not JSON serializable 
    fout.write(json.dumps(gen(list(rows)), indent=4)) 
+1

耶穌,那臺電腦多大了? – Carcigenicate

+0

如果您不想一次性將所有結構讀入內存,請使用該語言的懶惰。如果Python支持任何惰性處理(可能通過流),您將需要查找。 – Carcigenicate

+1

只需使用一個循環:'對於閱讀器中的行:writer.writerow(row)'。 – eryksun

回答

1

使用json.dumps時,你總是需要編寫數據一次

不是真的。你真的應該採用流式處理大數據。在這種情況下,像:

fout.write('[') 
for ii, row in enumerate(rows): 
    if ii != 0: 
     fout.write(',\n') 
    json.dump(row, fout, indent=4) 
fout.write(']') 

這樣你就可以一次寫一行,並且您還可以節省把所有的rowslist,你不需要的開銷。

+1

使用['json.dump'](https://docs.python.org/2/library/json.html#json.dump)而不是'json.dumps'。 – eryksun

+0

@eryksun:好主意,我改變了。 –

相關問題