Python 多处理加载数据并提交到sqlalchemy
我正在从文件中加载数据。我有很多文件,所以我有几个进程加载文件列表:Python 多处理加载数据并提交到sqlalchemy,python,mysql,python-3.x,dictionary,sqlalchemy,Python,Mysql,Python 3.x,Dictionary,Sqlalchemy,我正在从文件中加载数据。我有很多文件,所以我有几个进程加载文件列表: with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor: for x, y, z in executor.map(load_my_file, path_list): 加载我的文件:加载数据,将“用户”和“帖子”存储在两个dict中并返回它们,将每个用户和帖子合并到一个dict中,然后我批量提交它们 每个用户可能有许多帖子,但在文件
with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
for x, y, z in executor.map(load_my_file, path_list):
加载我的文件:加载数据,将“用户”和“帖子”存储在两个dict中并返回它们,将每个用户和帖子合并到一个dict中,然后我批量提交它们
每个用户可能有许多帖子,但在文件中,每个记录只是一篇帖子和一个用户。这就是dict背后的原因,所以我在使用sqlalchemy插入时没有主键副本
但是,这会占用大量内存。我有大约160万条记录,60万用户,我的python程序正在消耗大量内存(超过我16gb的ram允许的内存)
我研究过如何使用session.merge,但每次调用它时,它似乎都会查询数据库,这使得这个过程非常缓慢。还有别的办法吗?
我希望能够在每个进程中进行提交,而不是在最后将其全部合并到一个大目录中,但我不希望破坏任何关系或出现主键错误。非常奇怪的是,并行加载80个本地文件比一次加载一个要快得多。不过,我可能会提出一些理由 但是,好的。可以按原样将数据导入临时非规范化表。之后,使用SQL查询将数据复制到目标规范化表。然后删除临时表(如果需要,可以定期截断)。另外,看看SQLAlchemy查询:不仅
merge
会降低性能。通过add_进行的“大量”插入实际上并不是一次插入。您将使用insert
查询目录列表:
我研究过如何使用session.merge,但每次调用它时,它似乎都会查询数据库
情况更糟。它应该检查记录是否存在(第一次查询),然后插入或更新记录(第二次查询)。因此,将其用于处理大型数据阵列似乎有问题。为什么需要并发性?这真的有什么好处吗?您必须加载多少文件?这是从远程主机加载的吗?它提供了巨大的速度优势~80个文件。本地加载。