[英]python use diskspace instead of RAM by no sufficient RAM
考慮以下python代碼
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
有沒有辦法讓我的代碼使用磁盤空間而不是RAM,即使這會使它變慢呢? 還是這是一個操作系統問題,例如應該添加更多的交換?
上面的代碼只是一個例子
考慮這個例子
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))
我想到這個主意,但不確定是否會有所作為
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))
使用json.dumps時,您總是需要一次寫入數據
並不是的。 您確實應該對大數據采用流傳輸方法。 在這種情況下,類似:
fout.write('[')
for ii, row in enumerate(rows):
if ii != 0:
fout.write(',\n')
json.dump(row, fout, indent=4)
fout.write(']')
這樣,您可以一次寫入一行,並且還節省了將所有rows
放入不需要的list
的開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.