我正在Ubuntu 14.04服务器上运行python Flask应用程序,我在其中加载了一些数据,这两个主要内容是:
与Word2vec一起使用的Google新闻媒介(GoogleNewsVec约为4GB)
带有数据的350MB json文件
这一切都在我的本地Windows机器上加载~5分钟,其规格与服务器类似(8GB RAM)。奇怪的是,这两个部分分别装载很好。所以当我这样做时:
load_word2vec_model()
load_json_data()
它会很快加载模型并卡在load_json_data():
[13:16:55] Loading model..
[13:17:13] Finished loading model.
[13:17:13] Loading scores..
[13:17:13] Loading scores dict from json file..
但是当我以相反的顺序执行时:
load_json_data()
load_word2vec_model()
加载word2vec模型时遇到困难:
[13:20:29] Loading scores..
[13:20:29] Loading scores dict from json file..
[13:22:42] Finished loading from json file.
[13:22:42] Finished loading scores.
[13:22:42] Loading model..
我没有收到任何python错误消息。这让我相信服务器以某种方式达到了它的最大值。内存使用情况,不会加载整个模型。
在我的本地Windows机器上,它耗尽了大量内存,但最终会加载(总共大约5分钟)。为什么这不会发生在服务器上,我等了一个小时但它从未加载。
这是服务器的htop输出:
答案 0 :(得分:2)
Windows机器和Ubuntu服务器之间的差异很可能是由页面文件(Windows)/ swappiness(Linux)配置引起的。总而言之,交换是将内存的某些部分(最好是不那么重要的东西)存储到磁盘上,以便为需要内存的其他进程腾出一些空间。
现在,面向最终用户的Windows机器附带了一个页面文件,即用于写入内存内容的文件,大小配置约为内存大小的75%。但是想到的是Ubuntu服务器,通常没有交换分区/文件和swappiness,即你的内存将被交换到磁盘的可能性,设置为0,即根本不是。
解决方案是设置交换文件和swappiness配置,或者在问题上投入更多内存。前一种解决方案将使您的应用程序像在Windows上一样工作。后者将永远解决它。
<强> NVM:强> 看来你已经启用了交换功能。