我有一个大小为500MB
的文件,如果我将该文件的每一行存储在
file = "my_file.csv"
with open(file) as f:
for l in f:
delimiter = ','
line = l.split(delimiter)
hash_key = delimiter.join(line[:4])
store_line = delimiter.join(line[4:])
store_dict[hash_key] = store_line
为了检查我的记忆,我通过观察htop
来比较我的程序的内存使用情况,首先是上面的,然后将最后一行切换到
print(hash_key + ":" + store_line)
这花了< 100MB内存。
我的store_dict的大小在内存中大约为1.5GB
。我检查了内存泄漏,我找不到任何内容。删除此行store_dict[hash_key] = store_line
会导致程序执行< 100MB的内存。为什么这会占用如此多的内存?无论如何将行存储为字典而不是占用这么多内存?
答案 0 :(得分:2)
即使store_line
str
每个占用与磁盘上文件中相应文本相同的内存量(他们也没有,特别是如果你正在使用Python 3,其中str
默认为Unicode),dict
必然占用比文件更多的空间。 dict
不仅包含裸文本,还包含许多Python对象。
每个dict
键和值都是str
,它们不仅包含文本信息,还包含自己的长度和用于垃圾收集的引用计数。 dict
本身还需要存储有关其项的元数据,例如每个键的哈希值和指向每个值的指针。
如果文件中有一些非常长的行,那么您应该期望Python表示具有可比较的内存消耗。也就是说, if 你确定该文件使用与Python相同的编码...