我有一个Python3.4(64位)程序,用于加载大量数据(它需要大约15 Gb的磁盘空间,但我丢弃了一半的列)到一个简单的dict中。代码如下:
print('Reading accessions', file=sys.stderr)
taxids = {}
taxfile = open('prot.accession2taxid')
taxfile.readline()
for line in taxfile:
l = line.rstrip().split('\t')
taxids[l[0]]=int(l[2])
with open('/dev/shm/taxids.pickle', mode='w') as pickle_file:
pickle.dump(taxids, '/dev/shm/taxids.pickle')
print('Dumped', file=sys.stderr)
该文件基本上是TSV:
[amorozov@node006 nr]$ head -n 3 prot.accession2taxid
accession accession.version taxid gi
APZ74649 APZ74649.1 36984 1137646701
AQT41667 AQT41667.1 1686310 1150388099
当由htop
测量的内存消耗达到大约40 Gb(可用64 Gb)时,控制台上会打印以下异常:
Traceback (most recent call last):
File "../../scripts/rename_sequences.py", line 66, in <module>
taxids[l[0]]=int(l[2])
MemoryError
但是,脚本不会崩溃,甚至会继续执行某些事情。它运行的单核仍然是100%加载,但没有生成进一步的输出,程序也没有继续,因为没有生成/ dev / shm /中的文件。我理解,从实际的角度来看,答案是&#34;使用SQL&#34; (虽然我有点希望我能够将~8演出的明文装到64 gig的内存中;也许它会泄漏到哪里?),但是甚至发生了什么?这个例外似乎没有被捕获,但它也不会使脚本崩溃。
答案 0 :(得分:0)
Rhomboid at reddit提出的假设:脚本实际上终止了,但是终止需要花费很多时间,因为GC需要一些时间来收集dict中的大量对象。至少,它支持的事实是,如果我让流程继续运行,它会在几分钟内完成。