考慮以下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))
耶穌,那臺電腦多大了? – Carcigenicate
如果您不想一次性將所有結構讀入內存,請使用該語言的懶惰。如果Python支持任何惰性處理(可能通過流),您將需要查找。 – Carcigenicate
只需使用一個循環:'對於閱讀器中的行:writer.writerow(row)'。 – eryksun