繁体   English   中英

数据的多处理加载并提交到sqlalchemy

[英]Multiprocessing loading of data and committing to sqlalchemy

我正在从文件加载数据。 我有很多文件,因此有一些进程正在加载文件列表:

 with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
    for x, y, z in executor.map(load_my_file, path_list):

加载我的文件:加载数据,将“ USERS”和“ POSTS”存储在两个字典中,然后将它们返回,将用户和帖子分别合并为一个字典,然后批量提交。

每个用户可能有很多帖子,但是在文件中,每个记录只是一个帖子和一个用户在一起。 因此,这就是字典背后的原因,因此在使用sqlalchemy进行插入时,我没有主键重复项。

但是,这会占用大量内存。 我大约有160万条记录,有60万个用户,我的python程序正在消耗大量的内存(超过了我的16GB RAM所允许的内存)。

我调查了使用session.merge的过程,但似乎每次调用它都会查询数据库,这使过程非常缓慢。 还有其他解决方法吗? 我希望能够在每个流程中进行提交,而不是在最后将所有内容合并为一个大字典,但是我不想破坏任何关系或出现主键错误。

奇怪的是,并行加载80个本地文件比一次加载一个要快得多。 我可能会为此提出一些理由。

但是没问题。 您可以按原样将数据导入到临时的非规范化表中。 之后,使用SQL查询将数据复制到目标规范化表。 然后删除临时表(如果需要,则将其截断)。 另外,请查看您的SQLAlchemy查询:不仅merge还会降低性能。 实际上,通过add_all进行的“大量”插入不会变成单个插入。 您将使用带有字典列表的insert查询: 我正在用ORM插入400,000行,这确实很慢!

我调查了使用session.merge的情况,但每次调用它似乎都在查询数据库

更糟的是。 它应该检查记录的存在(第一个查询),然后插入或更新记录(第二个查询)。 因此,将其用于处理大量数据似乎很可疑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM