处理数百万个图像文件,并将每个文件插入mongodb



我在S3上收集了大量图像文件(约800000个图像,1TB+总大小(,我使用一些Python代码将其处理到字典中,以便插入MongoDB。字典包含一个缓冲区,类似np.frombuffer的命令使用该缓冲区来重建图像。

我需要处理每个文件并将其插入到MongoDB中。到目前为止,我已经尝试过多处理代码,虽然这很有效,但每次插入都会越来越慢——50000个文件需要20分钟,250000个文件需要5小时。

我有两件事不确定:

  1. 为什么随着数据库中文档数量的增加,插入速度会变慢,我该如何解决这个问题?我猜这是因为你的记录越多,Mongo就需要做更多的工作来检查它试图插入的记录是否已经存在,但我不知道如何缓解这种情况
  2. 解决这类问题的最佳方法是什么?我的另一个想法是在本地编写处理后的图像文件后进行批量插入

下面的代码示例:

def process_image(img_file):
# define MongoClient and collections
client = MongoClient(...)
collection = client['collection_name']
# read image file from s3
obj = s3.Object(bucket_name='test_bucket', key=img_file)
im = Image.open(obj.get()['Body'].read()

# create image buffer
buffer = cv2.imencode(".jpg", im)
buffer = buffer.flatten().tobytes() # usually around 100,000 bytes
# dict to be written to mongo
d = {}
d['filename'] = img_file
d['buffer'] = buffer

# insert to mongo
collection.insert_one(d)
### multiprocessing code
from multiprocessing import Pool
pool = Pool(processes=16)
results = pool.map(process_image, ls_filenames, chunksize=500)
pool.close()
pool.join()

ls_filenames中有大约800k个图像路径

每次创建MongoClient都会产生不必要的开销。创建一次并重用连接。

最新更新