为什么mmap标志可以减少单个Word2Vec实例的内存消耗

时间:2019-05-21 10:33:38

标签: ram gensim mmap word2vec

根据文档和维基百科:

mmap允许进程共享相同的ram块

word_vectors = KeyedVectors.load(config.get(wv_file))

以这种方式加载的模型需要约2.2 GB内存

word_vectors = KeyedVectors.load(config.get(wv_file), mmap='r')

以这种方式加载的模型需要约1.2 GB内存

为什么我观察到公羊消耗量急剧下降?

同时加载多个模型,按预期工作,并且模型共享〜1 GM内存。

1 个答案:

答案 0 :(得分:1)

内存映射重新使用了操作系统的虚拟内存功能,以将现有文件用作一系列可寻址内存的备份源。

通过一个进程,它不一定会节省任何内存。相反,它只是:

  • 延迟将所有地址范围加载到RAM中,直到请求时将其保留在磁盘上。如果从未请求过,则永远不会使用RAM,因此在特定情况下它可能会“节省”内存。

  • 允许如果一段时间未访问它们,则将这些加载的范围廉价地丢弃,并且需要其他分配使用RAM –因为可以根据需要从磁盘重新加载这些范围如果再次需要。因此,与耗尽RAM或激活其他不了解与现有磁盘文件的1:1关系的通用虚拟内存相比,在这种情况下,它可能“节省”内存。 (没有内存映射,RAM中很少使用的材料范围可能会写到一个单独的交换文件中,以释放空间用于其他分配–当数据已经存在于磁盘上某个位置时,这是一种浪费的操作,并且是冗余数据。) / p>

不幸的是,在单进程的常见情况下,像most_similar()这样的典型操作必须在每个矢量上进行计算,整个结构将被带入每个most_similar()的内存中。那里没有净的RAM“节省”(尽管如果其他内存压力会迫使页面调出加载的范围,则可能会给CPU / IO带来一点好处)。 (无论使用哪种方法,使用的“〜2.2 GB”和“〜1.2 GB” RAM值都可能无法正确测量。)

主要优点是在使用多个进程时每个进程都需要查阅同一文件的数据。如果天真地加载到RAM中,则每个进程将具有其自己的相同数据的冗余副本。如果使用内存映射,则应让OS知道:这些地址空间中的多个数组在多个单独处理后,定义上具有相同的数据(反映在文件中)。无论有多少个进程需要数据,每个文件范围中只有一个副本将消耗RAM。在那里,可以节省很多。