2011-01-26 26 views
1

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

+0

我会弄清楚如果你的程序在阅读和解析XML文件或者向数据库提交数据时遇到瓶颈。除非你有大量的文本数据,否则我会猜测前者。 – Thanatos 2011-01-26 16:19:27

回答

0

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

无论您选择哪种语言,您当然都希望使用COPY FROM和可能使用Perl/Python /其他语言的stdin将数据提供给Postgres。

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

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

1

我认为这将是更快,当你在管道中,将使用小程序:

  • 加入您的文件到一个大的数据流;

  • 解析输入流,并生成在PostgreSQL的COPY格式的输出数据流 - 相同的格式pg_dump的使用当创建备份,类似于制表符分隔值,看起来像这样:

 
COPY table_name (table_id, table_value) FROM stdin; 
1 value1 
2 value2 
3 value3 
\. 
  • 将COPY流加载到Postgresq中,暂时启动“-F”选项以禁用fsync调用。

例如在Linux上:

find -name \*.xml -print0 | xargs -0 cat \ 
    | parse_program_generating_copy \ 
    | psql dbname 

使用COPY比使用ORM将快得多。加入文件将平行读写数据库。禁用“fsync”将允许大幅加速,但如果加载期间服务器崩溃,则需要从备份恢复数据库。