考虑以下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))
我接受了这个想法,但我不确定它是否有所作为
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))
答案 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
的开销。