我有一个具有特定结构的PostgreSQL数据库,我有几百万个xml文件。我必须解析每个文件,并获取某些数据并填充数据库中的表。我想知道的是执行此例程的最佳语言/框架/算法 我使用DbLinq ORM在C#(Mono)中编写了一个程序。它不使用线程,它只是逐个文件解析,填充表对象并将某些对象组(例如200)提交给数据库。它似乎相当缓慢:它每分钟处理大约400个文件,完成这项工作大约需要一个月 我问你的想法和提示。
答案 0 :(得分:1)
我认为当你在管道中使用小程序时会更快:
将您的文件加入一个大流;
解析输入流并以PostgreSQL COPY格式生成输出流 - pg_dump在创建备份时使用的格式与tab-separated-values类似,如下所示:
COPY table_name (table_id, table_value) FROM stdin; 1 value1 2 value2 3 value3 \.
例如在Linux上:
find -name \*.xml -print0 | xargs -0 cat \
| parse_program_generating_copy \
| psql dbname
使用COPY比使用ORM插入要快得多。连接文件将并行读取和写入数据库。禁用“fsync”将允许大幅加速,但如果服务器在加载过程中崩溃,则需要从备份恢复数据库。
答案 1 :(得分:0)
一般来说,我相信Perl是解析任务的好选择。我自己也不认识Perl。听起来对你来说,你有如此极端的性能要求,你可能需要创建一个XML解析器,因为标准的性能可能会成为瓶颈(你应该在开始实现之前测试它)。我自己使用Python和psycopg2与Postgres进行通信。
无论您选择哪种语言,您当然都希望使用COPY FROM和stdin使用Perl / Python /其他语言将数据提供给Postgres。
除了花费大量时间优化所有内容之外,您还可以使用次优解决方案并在100 EC2实例上以极端并行方式运行它。这比花费数小时和数小时寻找最佳解决方案便宜得多。
在不知道文件大小的情况下,每分钟400个文件听起来不太糟糕。问问自己是否值得花费一周的时间来将时间减少到三分之一或者现在只运行它并等待一个月。