我正在开发一个研究平台,通过Twitter API读取相关的Twitter提要,并将它们存储在PostgreSQL数据库中以供将来分析。中间件是Perl,服务器是运行Debian linux的8GB内存的HP ML310。
问题是twitter feed可能非常大(每秒很多条目),而且在返回等待下一条推文之前我无法等待插入。所以我所做的就是使用fork(),这样每条推文都会获得一个新进程,可以插入到数据库和监听器中,并快速返回以获取下一条推文。但是,由于这些进程中的每一个都有效地打开了与PostgreSQL后端的新连接,因此系统永远不会赶上它的推文源。
我愿意使用连接池建议和/或在必要时升级硬件以使其工作,但我将不胜感激任何建议。这可能是RAM限制,还是有配置或软件方法我可以尝试使系统足够快?
答案 0 :(得分:6)
如果您打开并关闭每个插入的新连接,那将会耗费大量时间。您应该使用连接池。创建新的数据库连接不是一件轻松的事情。
为每个插件执行fork()可能也不是一个好主意。您不能创建一个简单地处理套接字上的插入和侦听的进程,或者扫描目录或类似的东西以及发出插入过程的信号的另一个进程(传统的生产者/消费者模式)。或者使用某种消息队列(我不知道Perl,所以我不能说那里有什么样的工具)。
进行批量插入时,在单个事务中执行它们,最后发送提交。不要提交每个插入。另一个选择是将行写入文本文件,然后使用COPY
将它们插入到数据库中(它不会比这更快)。
您还可以稍微调整PostgreSQL服务器。如果您在系统崩溃时可以丢失一些交易,则可能需要关闭synchronous_commit
。
如果您可以随时从头开始重建表(例如通过重新插入推文),您可能还希望将该表设为“未记录”表。它比写作中的常规表更快,但如果Postgres没有干净地显示,则会丢失表中的所有数据。
答案 1 :(得分:0)
使用COPY命令。 一个脚本读取Tweeter并将字符串附加到磁盘上的CSV文件中。 其他脚本在磁盘上查找CSV文件,重命名此文件并从此文件启动COPY命令。