我需要连接所有 PostgreSQL 表并在Python 字典中转换它们。数据库中有 72 个表。总列数大于 1600。
我编写了一个简单的 Python 脚本来连接多个表,但由于 the memory error 而无法连接所有表.脚本执行期间所有内存都被占用。我在具有 128GB RAM 和 8 个 CPU 的新虚拟服务器上运行脚本。它在 lambda 函数执行期间失败。
如何改进以下代码以执行所有 表连接?
from sqlalchemy import create_engine
import pandas as pd
auth = 'user:pass'
engine = create_engine('postgresql://' + auth + '@host.com:5432/db')
sql_tables = ['table0', 'table1', 'table3', ..., 'table72']
df_arr = []
[df_arr.append(pd.read_sql_query('select * from "' + table + '"', con=engine)) for table in sql_tables]
df_join = reduce(lambda left, right: pd.merge(left, right, how='outer', on=['USER_ID']), df_arr)
raw_dict = pd.DataFrame.to_dict(df_join.where((pd.notnull(df_join)), 'no_data'))
print(df_join)
print(raw_dict)
print(len(df_arr))
可以用Pandas吗为了我的目的?有更好的解决方案吗?
最终目标是denormalize数据库数据能够将其索引到 Elasticsearch作为文档,每个用户一个文档。
最佳答案
为什么不创建一个 postgres 函数而不是脚本?
这里有一些建议可以帮助您避免内存错误:
- 您可以使用 WITH 子句来更好地利用您的内存。
- 您可以创建一些物理表来存储以下信息 数据库的不同表组。这些物理表将避免使用大量内存。之后,您所要做的就是仅连接那些物理表。您可以为其创建一个函数。
- 您可以通过非规范化所需的表来创建数据仓库。
- 最后但同样重要的是:确保您正确使用索引。
关于python - 加入所有 PostgreSQL 表并制作一个 Python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498948/