简介
最近,我经常收到关于ATM的负面反馈。
主要原因是内存问题(消耗过多的内存),相关的邮件列表线程(最新):
- https://groups.google.com/forum/#!searchin/gensim/author|sort:date/gensim/gG7aiNI1v-Y/SWPMuP8BAwAJ
- https://groups.google.com/forum/#!topic/gensim/wI3x1fqR5wk
我决定找出发生了什么。
调查
我基于https://groups.google.com/forum/#!searchin/gensim/author|sort:date/gensim/gG7aiNI1v-Y/SWPMuP8BAwAJ的作者提供的数据运行ATM(目前我无法发布它,我正在等待其所有者的许可)。
数据的基本统计信息:
- 字典大小:12211
author2doc
Map的大小:106133author2doc
Map的大小:73248
我使用调试器运行它,发现最耗内存的地方在这里:
https://github.com/RaRe-Technologies/gensim/blob/f9669bb8a0b5b4b45fa8ff58d951a11d3178116d/gensim/models/atmodel.py#L680-L684
当进程已经消耗了8GB的RAM时,我停止了它,并在表格中呈现了一些有用的统计信息。
| expr | value | comment |
| ------------ | ------------ | ------------ |
| len(author2doc.keys())
| 106133 | |
| author2doc.keys().index(_)
| 3649 | 当前处理元素的索引,即106133中的3649(约占总数的3%) |
| len(train_corpus_idx)
| 1119955735 | train_corpus_idx
是最大的内存消耗者。在这里,我们实际上将整个语料库加载到内存中(这并不是“在线”或“批处理”处理) |
通过简单的计算,当循环完成时,过程将消耗~232GB of RAM
。
这绝对是不可接受的,甚至不允许在某些学习任务上使用模型(我甚至不谈论“真正的”任务)。
@olavurmortensen,你能调查一下这个问题吗?这是非常关键的?
相关PR - #893 。
1条答案
按热度按时间dfddblmv1#
更新: