Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理加载数据并提交到sqlalchemy_Python_Mysql_Python 3.x_Dictionary_Sqlalchemy - Fatal编程技术网

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个文件。本地加载。