我正在Python 3中使用csv.DictReader
处理一个很大的CSV文件。而且我发现了一个奇怪的内存使用问题。
代码是这样的
transform(value: QueuedTemplateDto[], filterBy: string): QueuedTemplateDto[] {
filterBy = filterBy ? filterBy.toLocaleLowerCase() : null;
return filterBy
? value.filter((check: QueuedTemplateDto) => check.user.toLocaleLowerCase().indexOf(filterBy) !== -1)
: value;
}
在程序上方的代码中,import os
import csv
import psutil # require pip install
# the real CSV file is replaced with a call to this function
def generate_rows():
for k in range(400000):
yield ','.join(str(i * 10 + k) for i in range(35))
def memory_test():
proc = psutil.Process(os.getpid())
print('BEGIN', proc.memory_info().rss)
fieldnames = ['field_' + str(i) for i in range(35)]
reader = csv.DictReader(generate_rows(), fieldnames)
result = []
for row in reader:
result.append(row)
print(' END', proc.memory_info().rss)
return result
if __name__ == '__main__':
memory_test()
的内存使用情况(需要安装print
),结果类似于
psutil
您可以看到该过程结束时将需要近2GB的内存。
但是,如果我复制每一行,则内存使用率会降低。
BEGIN 12623872
END 2006462464
结果就像
def memory_test():
proc = psutil.Process(os.getpid())
print('BEGIN', proc.memory_info().rss)
fieldnames = ['field_' + str(i) for i in range(35)]
reader = csv.DictReader(generate_rows(), fieldnames)
result = []
for row in reader:
# MAKE A COPY
row_copy = {key: value for key, value in row.items()}
result.append(row_copy)
print(' END', proc.memory_info().rss)
return result
它仅需要约1.29G的内存,而更少。
(我在64位Ubuntu上测试了代码,并得到了这些结果。)
为什么会这样?从BEGIN 12726272
END 1289912320
复制行是否合适?
答案 0 :(得分:2)
如果您$data['newURL'] = $_SERVER["REQUEST_URI"];
,您会发现print(row)
是row
。在第二个示例中,您将此OrderedDict
替换为普通的OrderedDict
。他们是不同的。
在第二个示例中,您可以使用dict
来获得相同的结果:
OrderedDict