簡體   English   中英

Python沒有足夠的RAM使用磁盤空間而不是RAM

[英]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))

使用生成器更新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))

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM