如何减少 MongoDB 的内存消耗并提高其响应时间?或者 Python 中具有相同改进的解决方法?

How to reduce MongoDB's memory consumption and improve its response time? Or a workaround in Python with the same improvements?

我正在使用“MongoDB v4.2.x”。我的服务器内存只有 4GB,MongoDB 使用率超过 60%。我是运行简单查询,连聚合都不会,响应时间太慢

问题:查询 MongoDB 数据库时如何减少内存消耗并提高响应时间?

目前的想法:

  1. MongoDB中是否有内存限制选项,以便加载数据库中未使用的部分可以外包到磁盘?

  2. 将“wiredTiger”缓存大小更改为 1GB,但响应时间仍然很慢。还有其他 MongoDB 调整吗?

  3. Python 中是否有解决方法而不是调整 MongoDB 本身?

如果你只是想提高响应时间并减少MongoDB消耗的内存,一个解决方法是将MongoDB数据加载到pandasDataFrame中,两种选择如下.

  1. PyMongo 的 bson 模块:如果它真的只是连接到 MongoDB 的问题,您可以导出数据库(或者至多是您真正需要的确切部分)作为一个 bson 文件,然后使用 pymongo 的 bson.decode_all() 将整个 bson 文件读入一个 pandas DataFrame。有关详细信息,请参阅 Read BSON file in Python?

  2. MongoDB 集合:或者如果您至少在开始时打开了 MongoDB,则可以将数据从 MongoDB 集合加载到 pandas DataFrame,参见 How can I load data from MongoDB collection into pandas' DataFrame?。加载后,关闭 MongoDB 以释放应用程序消耗的内存。

开始时加载数据库的额外时间是 one-off 成本。一旦将整个数据库放在一个数据框中,就可以使用 Python 查询该 in-memory DataFrame。

如何在 Python 中减少内存消耗和响应时间:

  • 您可以在 Python 脚本的 运行 期间释放内存,请参阅 How can I explicitly free memory in Python?,或者覆盖对象。

  • 避免不需要的对象复制,使用参数“inplace”更改对象/self-assign更改对象/使用。to_numpy(copy=False)/使用其他技巧来制作对象就地更改,即避免复制。

  • 对于大规模操作,尽可能将 pandas 对象转换为 numpy 对象。 Python 建立在 numpy 上并且在 numpy 上最快,pandas 提供更多(和更舒适)的选项但有更多的开销。

  • 选择列表理解而不是 df.apply() / df.iterrows(),请参阅

并且当你在 DataFrame 中有一个数据库时,你还需要考虑:

您可能想要在宽格式和长格式之间切换:

  • df.explode() / df.groupby(参见 的时间序列)
  • df.pivot 对比 df.melt(= 逆轴)。