Python 使用sqlalchemy-瓶颈从XML提取并加载到Postgres

Python 使用sqlalchemy-瓶颈从XML提取并加载到Postgres,python,sqlite,postgresql,amazon-web-services,sqlalchemy,Python,Sqlite,Postgresql,Amazon Web Services,Sqlalchemy,我需要将大量XML数据加载到postgres数据库中(每天超过1000万行)。当我使用sqlite时,一切都在本地发生得非常快。当我在本地使用postgres时,事情会变慢,而当我使用AWS EC2/RDS时,事情会变慢。下面是一些伪代码和基准测试。有什么线索导致瓶颈吗 1 for observation in xml_data: 2 new_reading = Reading() 3 for attr_name, attr_value in observation.iteritems(

我需要将大量XML数据加载到postgres数据库中(每天超过1000万行)。当我使用sqlite时,一切都在本地发生得非常快。当我在本地使用postgres时,事情会变慢,而当我使用AWS EC2/RDS时,事情会变慢。下面是一些伪代码和基准测试。有什么线索导致瓶颈吗

1 for observation in xml_data:
2   new_reading = Reading()
3   for attr_name, attr_value in observation.iteritems():
4     setattr(new_reading, attr_name, attr_val)
5   session.add(new_reading)
6 session.commit()
我使用的是Python 2.7.5、postgres 9.2.4、SQLAlchemy==0.9.6、psycopg2==2.5.3

  • 本地,sqlite
    • 第1-5行:13k读数/秒
    • 第6行:9.8k行/秒
  • 本地、博士后
    • 第1-5行:13k读数/秒
    • 第6行:5.7k行/秒
  • AWS、RDS和博士后
    • 第1-5行:5.1k读数/秒
    • 第6行:1.1k行/秒

我不明白为什么我看到从sqlite到postgres的写入速度会降低,甚至更不明白为什么我的11英寸MBA比AWS m1.medium实例更快。

ORM通常不是为批量插入而设计的。但似乎SQLAlchemy试图给你一些东西:

有一些专门的方法可以插入一整组行:

  • 请您的DB
  • 具有多行(例如,您可以将其插入1000 x 1000)
  • (一次发送和解析INSERT,多次发送数据)
我个人比其他解决方案更经常地将insert用于多行

localhost测试和AWS测试之间的差异可能在于程序和postgresql server之间的往返时间,因此减少往返次数(大容量插入)可能是解决方案