我有很多csv格式的数据。我需要能够基于一个文本字段(主键)为这些数据建立索引,所以我正在考虑将其输入数据库。我熟悉以前项目中的sqlite,所以我决定使用这个引擎。
经过一些实验后,我意识到在一张表中存储一亿条记录将无法正常工作:索引步骤很快就会慢到爬行。我可以想出两个解决这个问题的办法:
把数据分成几个表
把数据分成几个数据库
我采用了第二种解决方案(它生成几个大文件,而不是一个大文件)。我的分区方法是看主键的前两个字符:每个分区大约有200万个记录,并且大约有50个分区。
我在python中使用sqlite3模块完成这项工作。在整个过程中,我保持50个打开的数据库连接和打开的游标。对于每一行,我查看主键的前两个字符,通过字典查找获取右光标,并执行一个insert语句(通过调用光标上的execute)。
不幸的是,插入速度在一段时间后仍然会降低到一个无法忍受的水平(总共处理了大约1000万条记录)。我能做些什么来解决这个问题?有没有更好的方法来做我正在做的事?

最佳答案

我认为你的问题是,一旦处理不能仅仅使用内存缓冲,你的硬盘头只是在50个位置之间随机跳跃,这是狗慢。
您可以尝试一次只处理一个子集:

seen = {}   # Key prefixes already processed
while True:
    k0 = None  # Current prefix
    for L in all_the_data:
        k = L[0][:2]
        if k not in seen:
            if k0 is None:
                k0 = k
            if k0 == k:
                store_into_database(L)
    if k0 is None:
        break
    seen.append(k0)

这将使n+1传递数据(其中n是前缀的数目),但只访问两个磁盘位置(一个用于读取,一个用于写入)。如果你有单独的物理设备,它应该工作得更好。
PS:您真的确定SQL数据库是解决此问题的最佳解决方案吗?

关于python - 在SQLite数据库中插入超过一亿行的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17826391/

10-11 04:48
查看更多