mongodb和多处理-大内存使用

时间:2019-08-26 20:57:08

标签: python mongodb design-patterns multiprocessing pymongo

我正在利用多处理程序来解析文件以输入到数据库中,并且遇到了一个非常普遍的问题,即从这几个进程中将数据馈送到数据库的连接中。
当然,有几种不同的方法可以执行此操作,其中一些是:

  1. 在一个池中创建多个进程,然后将这些数据馈送到与数据库的一个连接中。这需要在池的输出端建立一个队列,并使池等待直到队列完成一个过程才能接收另一个作业。

  2. 在一个池中创建几个进程,每个进程都有自己的数据库连接并并行运行。 (即让数据库驱动程序处理并发性)

  3. 与(1)相同,但包括一个连接池来处理队列

许多选项的问题是,每个进程中传递和存储的数据是否很大,因此每个进程都需要等待数据通过数据库持久存储在磁盘上,然后才能检索下一个作业。 / p>

这似乎是在(1)的实现中解决的。

我尝试了以下方法(有效),但这会产生一个mongodb进程,该进程会累积大量RAM使用量。

from p_tqdm import p_imap
import gc
import pymongo
import time


def data_chunk_process(f):
    # Some processing that takes time
    time.sleep(3)
    # Some ranom data that's fairly large
    m = 100
    n = 10000
    d = [{str(k):str([v]*100) for k, v in zip(range(m), range(m))} for i in range(n)]

    conn = pymongo.MongoClient()
    cln = conn['testDB']['test_collection']
    cln.insert_many(documents=d)

    conn.close()


class Database:
    def __init__(self):
        # Perhaps we could simply use one connection?
        self.conn = pymongo.MongoClient()

    def database_insertions(self):
        files = list(range(1000))
        # Process one thousand files, with each file consisting of several thousands of documents
        for file_doc_chunk in p_imap(data_chunk_process, files):
            gc.collect()

db = Database()
db.database_insertions()

一览输出:

CPU%   MEM%  VIRT  RES     PID USER          TIME+ THR  NI S  R/s W/s Command
0.3    41.9  93.6G 92.2G 32344 mongodb       30:16 32    0 S    ? ?    /usr/bin/mongod

我担心如果在具有较少RAM(例如〜4-8 GB)的计算机上执行此脚本,由于使用了所有可用RAM,系统将崩溃。

如何消除此约束?

0 个答案:

没有答案