您如何找到程序的限制因素?

时间:2011-06-03 04:00:47

标签: postgresql benchmarking bulkinsert

我创建了一个程序来解析文件中的数据并将其导入关系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。 对于文件中的大多数(但不是全部)数据,我逐行进行,这是一个示例“

  1. 返回tableA中partA的ID。
    • 如果ID不存在,请将partA插入tableA,返回ID
  2. 返回tableB中partB的ID。
    • 如果ID不存在,请将partB插入tableB,返回ID
  3. 返回partA和partB的多对多关系的ID。
    • 如果关系的ID不存在,请创建它。
    • 其他更新关系(带有日期ID)
  4. 转到下一行。
  5. 为了保存许多查询,我将插入的PartA和PartB项目的ID保存在内存中以减少查找。

    以下是我的postgresql.conf文件的副本:http://pastebin.com/y9Ld2EGz我更改了默认数据目录和内存限制的唯一内容。

1 个答案:

答案 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有自己的等等。