请教 go 和 Python 逐行读文件,然后 insert 到数据库,哪个更快?

2018-07-22 11:14:33 +08:00
 sjmcefc2

用 python 的 mmap 来读文件,insert 到数据库,总感觉速度特别慢? pgadmin4 显示每秒 600transaction,cpu 使用率也非常低,iostat 貌似才几十 k/s。 是语言问题? go 能更高效吗? 或者是数据库设置问题? 或者是 insert 方式问题? 如何才能机器性能完全释放,把 postgres 发挥到最大? 很多配置已经参考了德哥 blog。

4251 次点击
所在节点    Go 编程语言
32 条回复
sjmcefc2
2018-07-22 15:19:34 +08:00
@q2683252 另外这个单机 50w/s 是从哪里得出的数据?一直不知道怎么衡量性能。
q2683252
2018-07-22 15:24:06 +08:00
@sjmcefc2 之前我自己导入过一些数据 50w 条我记得 几秒就好了 。
有一个方法 ,你不需要知道哪条 copy 错了,因为每一个 copy 是一个事务,
比如你批量 copy 5000 条 ,中间一条错了是吧,肯定是某一条开始出现问题,
那么就试一下 copy2500 条,如果出现错误,那么错的数据肯定在 2500 条内。
依次类推, 就是二分的思想
limbo0
2018-07-22 16:34:01 +08:00
用 begin commit 事务,中间出错会 rollback,然后根据报错信息调整
sjmcefc2
2018-07-22 19:02:40 +08:00
@limbo0 貌似这样的话,很难用 python 程序自动处理啊,数据可能只有一条错,也可能整个文件都错了。
FenGuWu
2018-07-22 20:04:51 +08:00
跟语言没有关系。我也遇到了一样的问题。我用 java。一个事务提交 1w 条。开始 iostat 只有 16k。后来用 12 个线程往里怼,io 提高到 176k,server cpu 吃满。
hustlibraco
2018-07-22 22:55:18 +08:00
这种情况应该校验数据,使用数据库的批量导入方法,跟语言关系不大
sjmcefc2
2018-07-22 22:58:34 +08:00
@hustlibraco 很棒的思路啊。就是不知道如何校验数据,如何把能批量导入的弄出来,把不能批量的有错误数据弄出来。一个文件分成两个?
bbbai
2018-07-23 10:33:19 +08:00
分组插入 一组 5000 条,然后多开几个线程就会快些,1000w 八线程我跑了 30 分钟
sjmcefc2
2018-07-23 11:11:23 +08:00
@bbbai 能分享一下代码吗?机器配置如何?
YumeMichi
2018-07-23 11:35:52 +08:00
mysql 的话逐条 insert 肯定是很慢的 我以前的做法是每 5000 条 insert 合并成一条 这样能快很多 如果再加上多线程应该还能更快 但是因为 py 多线程这块当时没研究过 就只是用单线程跑的
bbbai
2018-07-23 12:04:13 +08:00
···
insert_p = ("INSERT INTO a_b_v("name","num")" "VALUES(%s,%s)")
for j in range(0,5000):

data_p = ("admin","0001")
data_p_list.append(data_cp)

cursor.executemany(insert_p,data_p_list)
db.commit()···
@sjmcefc2 核心就是这样,数据表多,行列多可能会很繁琐,可以考虑在数据结构进行优化。python2
Siglud
2018-07-23 14:27:37 +08:00
你这么写铁定慢,快速的写法是
INSERT INTO a_b_v("name","num") VALUES (%s,%s),(%s,%s),(%s,%s)....
后面拼 1000 条

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

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

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

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

© 2021 V2EX