在不使用PostgreSQL的情况下写入PostgreSQL数据库格式

时间:2011-06-09 12:11:43

标签: database postgresql data-structures etl

我从很多机器上收集了大量数据。这些机器无法运行PostgreSQL,无法连接到PostgreSQL数据库。目前,我将来自这些计算机的数据保存在CSV文件中,并使用COPY FROM命令将数据导入PostgreSQL数据库。即使在高端硬件上,这个过程也需要数小时。因此,我正在考虑直接将数据写入PostgreSQL数据库的格式。然后我会简单地将这些文件复制到/ data目录中,启动PostgreSQL服务器。然后,服务器将查找数据库文件并将其作为数据库接受。

这样的解决方案是否可行?

3 个答案:

答案 0 :(得分:4)

理论上,如果你非常仔细地研究PostgreSQL的源代码,这可能是可能的。

但是你基本上(重新)编写了PostgreSQL的核心,从我的角度来看,它被认为是“不可行”。

编辑:
你可能想看看声称比COPY更快的pg_bulkload(虽然没有使用它)

答案 1 :(得分:2)

为什么他们无法连接到数据库服务器?如果是因为库依赖,我建议您设置某种客户端 - 服务器解决方案(也许是Web服务),可以沿途排队和提交数据。

在处理大量数据时依赖批处理操作会让你头疼,如果COPY FROM对你来说不够快,我认为不会有什么。

答案 2 :(得分:1)

是的,你不能以任何合理的方式写出文件。除了数据页面格式之外,您还需要复制提交日志,预写日志的一部分,一些事务可见性部分,您使用的类型的任何转换代码,以及可能的TOAST和varlena代码。哦,以及系统目录数据,如前所述。粗略猜测,您可能只需要从服务器借用200K行代码。 PostgreSQL是从可扩展的基础上构建的;如果不首先在系统目录中查找整数类型的类型信息,你甚至无法解释整数意味着什么。

有一些提示可以在Bulk Loading and Restores加快COPY流程。特别是关闭synchronous_commit可能会有所帮助。另一个可能有用的技巧:如果你启动一个事务,TRUNCATE一个表,然后COPY进入它,那么COPY会更快。它不会受到通常的预写日志保护的影响。但是,很容易发现COPY实际上是CPU性能的瓶颈,而且你无能为力。有些人将传入的文件拆分成碎片,并立即运行多个COPY操作来解决此问题。

实际上,pg_bulkload可能是你最好的选择,除非它也受到CPU限制 - 此时数据库外部的分离器和多个并行加载确实是你需要的。