python使用磁盘空间而不是RAM没有足够的RAM

时间:2016-05-24 11:26:10

标签: python linux windows memory-management operating-system

考虑以下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,即使这会让它变慢?或者这是一个操作系统问题,应该添加更多Swap?

更新

上面的代码只是一个例子

考虑这个例子

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))

使用generator(lazy evolution)

更新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 个答案:

答案 0 :(得分: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(']')

这样你就可以一次写一行,同时也节省了将所有rows放入你不需要的list的开销。