我创建了一个程序来解析文件中的数据并将其导入关系postgresql数据库。 该计划已经运行了2周,看起来还剩下几天了。它平均每秒进口约150个。 如何找到限制因素并使其更快? 我的程序的CPU不超过10%,内存不超过7%。 Postgresql数据库CPU没有超过10%和25%的内存。
我猜测限制因素是硬盘写入速度,但我该怎样验证,如果是这样的话;改进它? (没有购买更快的硬盘)
这是“iostat -d -x”的输出:
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.59 3.23 0.61 1.55 23.15 38.37 28.50 0.01 5.76 1.04 0.22
sdb 0.02 308.37 21.72 214.53 706.41 4183.68 20.70 0.56 2.38 2.24 52.89
正如您可能猜到的,数据库位于sdb上。
编辑:我正在解析的文件大约是7GB。 对于文件中的大多数(但不是全部)数据,我逐行进行,这是一个示例“
为了保存许多查询,我将插入的PartA和PartB项目的ID保存在内存中以减少查找。
以下是我的postgresql.conf文件的副本:http://pastebin.com/y9Ld2EGz我更改了默认数据目录和内存限制的唯一内容。
答案 0 :(得分:2)
你应该在很多天前杀死这个过程并且要求不 how to find the limiting factor of the app
而是:
是否有更快的方式导入数据 进入pgSQL?
查看this question,然后查看pgSQL COPY documentation。使用适当的工具,您运行的导入过程可能需要数小时而不是数周才能实现。
顺便说一句,无论您使用什么样的RDBMS,程序化的数据插入都不会像RDBMS供应商提供的本机工具那样具有处理批量操作的能力。例如:SQL Server具有bcp,DTS / SSIS以及一些用于批量数据导入/导出的其他选项。 Oracle有自己的等等。