2

我正在开发一个研究平台,该平台通过 Twitter API 读取相关的 Twitter 提要,并将它们存储在 PostgreSQL 数据库中以供将来分析。中间件是 Perl,服务器是 HP ML310,8GB RAM 运行 Debian linux。

问题是 twitter 提要可能非常大(每秒有很多条目),我不能在返回等待下一条推文之前等待插入。所以我所做的是使用一个 fork() ,所以每条推文都有一个新的进程来插入数据库和侦听器并快速返回以获取下一条推文。然而,因为这些进程中的每一个都有效地打开了到 PostgreSQL 后端的新连接,所以系统永远不会赶上它的 twitter 提要。

如果有必要,我愿意使用连接池建议和/或升级硬件来完成这项工作,但如果有任何建议,我将不胜感激。这可能是 RAM 限制,还是我可以尝试使系统足够快的配置或软件方法?

4

2 回答 2

6

如果您为每个插入打开和关闭一个新连接,那将会很痛苦。您应该改用连接池。创建一个新的数据库连接不是一件轻量级的事情。

为每个插入执行 aa fork() 也可能不是一个好主意。难道你不能创建一个进程来简单地处理插入并在套接字上侦听,或者扫描目录或类似的东西,以及另一个进程发出插入进程的信号(经典的生产者/消费者模式)。或者使用某种消息队列(我不知道 Perl,所以我不能说那里有哪些可用的工具)。

在进行批量插入时,在单个事务中进行,最后发送提交。不要提交每个插入。另一种选择是将行写入文本文件,然后用于COPY将它们插入数据库(它不会比这更快)。

您还可以稍微调整 PostgreSQL 服务器。如果您能承受在系统崩溃时丢失一些事务,您可能需要synchronous_commit关闭。

如果您可以随时从头开始重建表(例如通过重新插入推文),您可能还希望将该表设为“未记录”表。它的书写速度比普通表格要快,但如果 Postgres 没有清晰地显示出来,就会丢失表格中的所有数据。

于 2013-01-10T21:20:30.390 回答
0

Use COPY command. One script reads Tweeter and appends strings to the CSV file on disk. Other scripts looking for CSV file on disk, renamed this file file and started COPY command from this file.

于 2013-01-10T21:43:26.607 回答