Python csv.DictReader的内存使用问题

时间:2018-08-08 08:36:07

标签: python memory-management

我正在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 复制行是否合适?

1 个答案:

答案 0 :(得分:2)

如果您$data['newURL'] = $_SERVER["REQUEST_URI"];,您会发现print(row)row。在第二个示例中,您将此OrderedDict替换为普通的OrderedDict。他们是不同的。

在第二个示例中,您可以使用dict来获得相同的结果:

OrderedDict