2016-04-24 55 views
1

我想向数据库添加大约7亿行和2列。使用下面的代码:如何减少在python中追加SQL数据库的时间

disk_engine = create_engine('sqlite:///screen-user.db') 
chunksize = 1000000 
j = 0 
index_start = 1 

for df in pd.read_csv('C:/Users/xxx/Desktop/jjj.tsv', chunksize=chunksize, header = None, names=['screen','user'],sep='\t', iterator=True, encoding='utf-8'): 
    df.to_sql('data', disk_engine, if_exists='append') 
    count = j*chunksize 
    print(count) 
    print(j) 

它需要很长时间(我估计它需要几天)。有没有更有效的方法来做到这一点?在R中,我一直使用data.table包加载大型数据集,只需要1分钟。 Python中是否有类似的包?作为一个切点,我想将这个文件实际存储在我的桌面上。现在,我假设'数据'被存储为临时文件。我将如何做到这一点?

此外,假设我将数据加载到数据库中,我希望查询在一分钟或更短时间内执行。这里是什么,我想用Python + SQL做一些伪代码:

#load data(600 million rows * 2 columns) into database 
#def count(screen): 
    #return count of distinct list of users for a given set of screens 

从本质上讲,我回到屏幕的数量为一组给定users.Is的数据太大了,这个任务?我也想把这个表与另一个表合并。 R中fread函数的速度要快多少?

+1

困扰,所以你正在使用SQLite。至于你的问题“是否有与R数据表等价的Python”。熊猫是那个图书馆。你的代码的慢部分是数据库写入。你不能从'df'变量本身来计算不同的用户吗?你为什么需要SQL? –

+0

我认为数据库执行查询会更快。作为python的新用户,我将如何查看df的记录?如果我打印(DF),我得到的对象名称,我认为写数据到SQL数据库将更容易编写查询方面,我也可以查看我的表的输出。另外,我不知道在我的pd.read_csv语句中加载数据需要多长时间。 – zorny

+0

在SQL中编写查询本身可能会容易很多,是的,但正如您发现的那样,将数据加载到数据库中很慢。就个人而言,我建议你看看[SparkSQL](http://spark.apache.org/docs/latest/sql-programming-guide.html#overview),并担心后面写入数据库文件。 –

回答

1

如果您的目标是将数据从您的TSV文件导入到SQLite中,您应该尝试SQLite本身的本地导入功能。只要打开sqlite控制台程序,做这样的事情:

sqlite> .separator "\t" 
sqlite> .import C:/Users/xxx/Desktop/jjj.tsv screen-user 

不要忘记做任何查询之前建立适当的索引。

+1

对于MySQL来说也是一样,顺便说一句。只需让数据库通过导入整个文件来处理导入。我已经在合理的时间(几十分钟)内用多GB文件完成了这项工作。 – roadrunner66

0

正如@John Zwinck已经说过的,您应该使用原生RDBMS的工具来加载这些数据量。

首先,我认为SQLite并不是适用于700万行的适当工具/数据库,特别是如果您想在此后加入/合并此数据。

根据您在加载后想要对数据执行的处理类型,我将使用free MySQL或者如果您负担得起集群 - Apache Spark.SQL并且在多个集群节点上并行处理您的数据。

为了将您的数据加载到MySQL DB中,您可以并应该使用本机LOAD DATA工具。

这里是展示如何优化数据加载过程的MySQL(对于不同:MySQL的版本中,MySQL选项,MySQL的存储引擎:MyISAM和InnoDB等)great article

结论:使用本地数据库的工具用于高效加载大量的CSV/TSV数据而不是熊猫,特别是如果您的数据不适合内存,并且您想要在加载后处理(加入/合并/过滤/等)您的数据。

+0

使用MySQL加载数据后,是否可以通过python/pandas轻松与该数据库进行交互?如果您只使用笔记本电脑,Spark也有用吗? – zorny

+0

@zorny,不,这个想法是你不想使用熊猫,除非你想要处理的所有数据都适合内存,或者你可以轻松地处理(连接,分组,汇总,过滤等)你的数据使用熊猫的块,这是很少的情况。 – MaxU

+0

@zorny,在一台机器/笔记本电脑上使用Spark没有什么意义,也许只是为了学习它......如果您没有其他选择,并且必须在笔记本电脑上处理所有数据,则可以尝试直接执行在MySQL中 - 它被设计用于处理关系数据;) – MaxU