求助如何快速导入数据到数据库

2015-08-23 02:30:11 +08:00
 fy
求助一下大家,我手上有一些历史数据想要导入到数据库( 100 多 G ),数据库是 PostgreSQL

然而问题是导入非常缓慢,慢到无法接受,请大家给我出个主意。


数据库是这样的:

表 1 :数据源信息 - (id, 文件名,数据时间,导入时间)

表 2 :数据子项 A - ( id, 属性若干,数据源 id )

表 3 :数据子项 B - ( id, 属性若干,数据源 id )

表 4 :数据关联 - (数据子项 A_id ,数据子项 B_id )

数据源和数据项是一对多的关系,单条数据项会根据需要分别存入 A 和 B 两个表,由额外的关联表来标出他们的联系。


我的办法是这样的,用 peewee 连接数据库,然后就那么正常的 create 对象,然而用不用事务都很慢。

从前倒是有过用 csv 导入数据,很快,但是这次涉及外键我也就没有太好的办法,求助!
2322 次点击
所在节点    Python
6 条回复
Septembers
2015-08-23 10:22:00 +08:00
先不要建立关系 导入之后再建立关系
see http://initd.org/psycopg/docs/cursor.html#cursor.copy_from
fy
2015-08-23 16:13:09 +08:00
@Septembers 可我这里还有一些别的问题: 1. 数据项中无主键, 2. 对于每一条数据而言,并不一定对应表 A 与表 A 的两条数据,可能这一条数据只在表 A 里面写。

这导致我建立联系的时候很麻烦
cxbig
2015-08-23 17:05:16 +08:00
1. 关闭外键检查,导入后再开启
2. 如果外键根据新数据表需要进行位移,使用 PHP 、 Ruby 、 Python 等语言读取数据,再用他们的 ORM 连接并导入数据
tesion99
2015-08-24 09:28:59 +08:00
Mysql 有 load data in file 可以把数据从文件按照指定分隔符,指定字段导入数据库, PostgrepSql 应该也有类似的命令,不过这种方式下最好把文件分割为多个小文件,不要太大了
hasdream
2015-08-24 15:23:54 +08:00
指定的格式 python/php/java 多线程去跑 , 多次测试。
fy
2015-08-25 02:59:47 +08:00
@hasdream 试过了 多线程没用

@tesion99 有这么回事,我也是这么想的 打算手动编制主键进行导入工作了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/215259

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX