MemoryError不会导致程序退出

时间:2017-03-31 09:54:23

标签: python python-3.x exception memory

我有一个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的内存中;也许它会泄漏到哪里?),但是甚至发生了什么?这个例外似乎没有被捕获,但它也不会使脚本崩溃。

1 个答案:

答案 0 :(得分:0)

Rhomboid at reddit提出的假设:脚本实际上终止了,但是终止需要花费很多时间,因为GC需要一些时间来收集dict中的大量对象。至少,它支持的事实是,如果我让流程继续运行,它会在几分钟内完成。