php - 处理大文件 + pgsql 表的最佳逻辑
问题描述
我有一个带有多个模式的 postgres 数据库,每个模式都有多个表,每个表都有几百万行。
有时,我必须下载一个包含几百万行的文件,并将每一行与所有表中的每一行进行比较,如果找到该行,我必须更新其中的一列。
我尝试的第一件事是逐行读取文件,在每个模式中的每个表上运行选择查询,如果找到行我运行更新,它在我的测试平台上运行良好,但是对于实际的数据库,它将永远运行,因为它每秒执行大约 1000 个查询(我检查了查询:)SELECT xact_commit+xact_rollback FROM pg_stat_database WHERE datname = 'mailtng_lists';
。
我尝试的第二件事是将主脚本与连接到数据库的脚本分开,所以我所做的是将大文件分成块,每个块有 100K 行,然后调用将执行连接 X 次的脚本使用以下命令:
foreach($chunks as $chunk) //$chunks is the result of the split command (no problem here)
{
exec("updater.php $chunk");
}
但它根本没有任何改进,每秒的查询数仍然很低,所以我尝试的最后一件事是做同样的事情,但使用 shell_exec 所以脚本不必等待输出,但服务器崩溃了我有 173 个块,因此调用了 173 个 php 实例。
关于如何处理这种情况的任何想法?
解决方案
推荐阅读
- python - 在 Python 中同时插入行
- c++ - 如何在 C++ 中同时写入文件(换句话说,写入文件的最快方法是什么)
- django - 从主要模型实例获取用户特定答案属性 - django
- php - 如何创建用户并链接到现有的 nexmo 应用程序?
- asp.net-core - Serilog 速度慢,性能差
- oracle-apex - 是否可以在没有 cookie 的情况下运行 Oracle Apex?
- node.js - 即使在页面刷新后如何保持登录状态?
- javascript - 将输入字段大小调整为其输入
- c - 将异常信号从子进程强制发送到父 c
- c# - Unity - 将具有继承类型的对象添加到继承类型的字段