我正在利用多处理程序来解析文件以输入到数据库中,并且遇到了一个非常普遍的问题,即从这几个进程中将数据馈送到数据库的连接中。
当然,有几种不同的方法可以执行此操作,其中一些是:
在一个池中创建多个进程,然后将这些数据馈送到与数据库的一个连接中。这需要在池的输出端建立一个队列,并使池等待直到队列完成一个过程才能接收另一个作业。
在一个池中创建几个进程,每个进程都有自己的数据库连接并并行运行。 (即让数据库驱动程序处理并发性)
与(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,系统将崩溃。
如何消除此约束?