繁体   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