gpt4 book ai didi

python - 数据的多处理加载并提交给 sqlalchemy

转载 作者:行者123 更新时间:2023-11-29 22:29:11 27 4
gpt4 key购买 nike

我正在从文件加载数据。我有很多文件,所以我有几个进程加载文件列表:

 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 内存允许的数量)。

我研究过使用 session.merge 但似乎每次调用它时都会查询数据库,使得该过程非常慢。还有其他办法解决这个问题吗?我希望能够在每个进程中进行提交,而不是最后将其全部合并到一个大字典中,但我不想破坏任何关系或出现主键错误。

最佳答案

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

但是,好吧。您可以将数据按原样导入到临时非规范化表中。之后,使用 SQL 查询将数据复制到目标规范化表。然后删除临时表(或者如果您定期需要则截断)。另外,看看您的 SQLAlchemy 查询:合并不仅会降低性能。实际上,通过 add_all 进行的“大量”插入不会变成单个插入。您可以将 insert 查询与字典列表一起使用: I’m inserting 400,000 rows with the ORM and it’s really slow! .

I looked into using session.merge but it seems to query the database every time I call it

情况更糟。它应该检查记录是否存在(第一个查询),然后插入或更新记录(第二个查询)。因此,使用它来处理大型数据数组看起来是有问题的。

关于python - 数据的多处理加载并提交给 sqlalchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29962139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com