Xml 用大量数据填充PostgreSQL数据库

Xml 用大量数据填充PostgreSQL数据库,xml,postgresql,Xml,Postgresql,我有一个具有特定结构的PostgreSQL数据库,我有数百万个xml文件。我必须解析每个文件,获取特定的数据并填充数据库中的表。我想知道的是执行此例程的最佳语言/框架/算法。 我用DbLinq-ORM用C#(Mono)编写了一个程序。它不使用线程,它只是逐个文件解析、填充表对象并将特定对象组(例如200)提交到数据库。它似乎相当慢:每分钟处理大约400个文件,完成这项工作大约需要一个月的时间。 我想听听你的想法和技巧。一般来说,我认为Perl是解析任务的好选择。我自己也不认识。在我看来,您的性能

我有一个具有特定结构的PostgreSQL数据库,我有数百万个xml文件。我必须解析每个文件,获取特定的数据并填充数据库中的表。我想知道的是执行此例程的最佳语言/框架/算法。
我用DbLinq-ORM用C#(Mono)编写了一个程序。它不使用线程,它只是逐个文件解析、填充表对象并将特定对象组(例如200)提交到数据库。它似乎相当慢:每分钟处理大约400个文件,完成这项工作大约需要一个月的时间。

我想听听你的想法和技巧。

一般来说,我认为Perl是解析任务的好选择。我自己也不认识。在我看来,您的性能要求非常高,可能需要创建一个XML解析器,因为标准解析器的性能可能会成为瓶颈(您应该在开始实现之前进行测试)。我自己使用Python和psycopg2与Postgres进行通信

无论您选择哪种语言,您肯定希望使用COPY FROM,也可能是stdin使用Perl/Python/other语言将数据提供给Postgres

您也可以使用次优解决方案,并在100个EC2实例上极端并行地运行它,而不是花费大量时间优化所有内容。这比花费数小时寻找最佳解决方案要便宜得多


在不知道文件大小的情况下,每分钟400个文件听起来并不太糟糕。问问自己,是否值得花费一周的开发时间将时间减少到三分之一,还是现在就运行并等待一个月。

一般来说,我认为Perl是解析任务的好选择。我自己也不认识。在我看来,您的性能要求非常高,可能需要创建一个XML解析器,因为标准解析器的性能可能会成为瓶颈(您应该在开始实现之前进行测试)。我自己使用Python和psycopg2与Postgres进行通信

无论您选择哪种语言,您肯定希望使用COPY FROM,也可能是stdin使用Perl/Python/other语言将数据提供给Postgres

您也可以使用次优解决方案,并在100个EC2实例上极端并行地运行它,而不是花费大量时间优化所有内容。这比花费数小时寻找最佳解决方案要便宜得多


在不知道文件大小的情况下,每分钟400个文件听起来并不太糟糕。问问自己,是否值得花一周的时间来开发,将时间减少到三分之一,还是现在就开始运行并等待一个月。

我认为在管道中使用小型程序会更快:

  • 将您的文件加入到一个大流中

  • 解析输入流并生成PostgreSQL COPY格式的输出流-pg_dump在创建备份时使用的格式与tab分隔值类似,如下所示:


使用复制比使用ORM插入要快得多。连接文件将并行地读取和写入数据库。禁用“fsync”将允许大幅加速,但如果服务器在加载过程中崩溃,则需要从备份中恢复数据库。

我认为,如果在管道中使用小型程序,速度会更快:

  • 将您的文件加入到一个大流中

  • 解析输入流并生成PostgreSQL COPY格式的输出流-pg_dump在创建备份时使用的格式与tab分隔值类似,如下所示:


使用复制比使用ORM插入要快得多。连接文件将并行地读取和写入数据库。禁用“fsync”可以大大提高速度,但如果服务器在加载过程中崩溃,则需要从备份中恢复数据库。

我会找出您的程序在读取和解析XML文件或向数据库提交数据时是否遇到瓶颈。除非您有大量的文本数据,否则我会猜测前者。我会找出您的程序在读取和解析XML文件或向数据库提交数据方面是否存在瓶颈。除非你有大量的文本数据,我猜是前者。 COPY table_name (table_id, table_value) FROM stdin; 1 value1 2 value2 3 value3 \.
find -name \*.xml -print0 | xargs -0 cat \
  | parse_program_generating_copy \
  | psql dbname