to_sql写入数据库遇到内存溢出错误的解决方案

to_sql写入数据库遇到内存溢出错误的解决方案

1.问题来源

最近在做项目时遇到了一些问题:项目用数据集太大,为了方便处理我想把它存到数据库中,但在使用to_sql函数写入时报错了,说是内存溢出,(双通道16G都不够,可知数据量有多大)

2.尝试解决

我想到的第一个办法是存为csv文件,然后在数据库管理工具中导入,虽然速度很慢,但问题好歹解决了。但是在后面使用的时候,发现了新的问题,导入的数据格式存在问题,例如纯数字的字符串型数据会被存为数字类型的。

3.更佳方案

后来通过查看Pandas文档,我找到了新的解决方案:Pandas使用read_csv函数读取csc文件的时候,可以设置chunksize参数,例如设置chunksize
为100,就表示每次读取100行,最终返回一个迭代类型,对迭代类型进行迭代,就可以得到一个个DataFrame。

4.实践

思路有了接下来就可以进行实践,我们先读取csv文件,设置参数chunksize为1000000,对得到的迭代类型就行迭代,并将每一个DataFrame存入MySQL数据库,这里需要设置to_sql函数的参数if_exists = ‘append’,意思是追加写入,可以防止后续写入的内容将前面内容覆盖。

5.代码如下

from sqlalchemy import create_engine
import pandas as pd

engine = create_engine('mysql+mysqldb://root:123456@127.0.0.1:3306/links', encoding='utf-8')
datas = pd.read_csv('data.csv', chunksize=1000000)

for data in datas:
	data.to_sql('link_tb', con=engine, if_exists='append')

6.结语

当然如果数据量庞大,这个方法也是非常耗费时间的,但亲测比导出成csv文件再导入要快得多,如果大佬们有更好的办法也请不吝赐教。(据说大规模的数据集使用HBase会更好,但我还不会先就这样吧。)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值