我正在尝试使用熊猫' python中的df.to_sql和SQlite3在数据库中放入大约2GB的数据和大约1600万行。我的策略是将原始CSV分成较小的数据帧,对它们执行一些操作,然后将它们放入SQL数据库中。
当我运行此代码时,它会快速启动但很快就会变慢。在大约300万行后,它减慢到这样的程度,因为它看起来不会在任何实际的时间内完成。造成这种情况的原因是什么?我该怎么办?我的代码如下:
def chunk_read_CSV_to_db(database, table, filepath, chunksize, delimiter=','):
start = dt.datetime.now()
conn = sqlite3.connect(database)
index_start = 1
j=0
for df in pd.read_csv(filepath, chunksize=chunksize, iterator=True, encoding='utf-8', sep=delimiter):
j+=1
print '{} seconds: complete {} rows'.format((dt.datetime.now() -start).seconds, j*chunksize)
df.to_sql(name=table, con=conn, flavor='sqlite', if_exists='append')
conn.close()
db_name = 'store_data.db'
f9 = 'xrf_str_geo_ta4_1511.txt'
chunksize = 20000
chunk_read_CSV_to_db(os.path.join(fp, db_name), os.path.splitext(f9)[0], os.path.join(fp, f9), chunksize = chunksize, delimiter='\t')
答案 0 :(得分:0)
我切换到了sqlalchemy,之后没有问题。没有明显的减速。代码如下。
task copyStringsUniversal(type: Copy) {
from 'src/main/res/values'
include 'strings.xml'
include 'array.xml'
into 'src/universal/res/values'
}
build.dependsOn copyStringsUniversal
答案 1 :(得分:0)
所以我知道这个答案将不再与作者有关,但我偶然发现了它,因为我遇到了完全相同的问题并想分享我的答案。
我试图使用append方法逐个将〜900 .csv文件加载到sql数据库中。加载开始很快,但是以指数方式减速并且从未完成运行。这让我怀疑是否存在涉及索引的错误(即每当我添加数据时,大熊猫都会以某种方式重新编制索引),因为这是我唯一想到的解释减速的方法(内存似乎是精细)。
最后,我开始通过命令行使用sqlite3 .index和.dbinfo方法来查看通过pandas创建的数据库,而不是直接通过sqlite3进行比较。我发现,当通过sqlite3处理时,pandas数据库有1个索引,而0则为0。此外,架构大小更大。
现在,pandas to_sql方法有一个索引参数。它说这个参数只是将数据帧索引添加为数据库中的一列(这听起来非常无害)。但事实证明它也使用该列作为数据库索引,看起来如果你使用append方法,那么它可能每次都重新计算这个索引(或者其他东西)。无论如何,当我将index参数设置为False时,.dbinfo在结果数据帧中显示0个索引,并且我的问题消失了 - 所有数据都在很短的时间内处理完毕。
所以解决方案是:
df.to_sql(name=table, con=conn, flavor='sqlite', if_exists='append', index = False)