【问题标题】:python code terminates when using read_sql_querypython代码在使用read_sql_query时终止
【发布时间】:2015-09-24 21:02:05
【问题描述】:

我有两个表:trainSearcStream 和 SearchInfo。我的代码应该基于名为 SearchID 的公共列合并两个表。问题是代码运行了一段时间,然后在我的 Eclipse 控制台中没有报告任何错误就终止了。每个表中的行数是:trainSearchStream|392,356,948 和 搜索信息|112,159,462。我的数据库(包括其他表)的大小是 40GB。 更新:当我在终端运行代码时,我收到一条消息:'killed: 9'

import pandas as pd
import sqlite3


# Create connection.
con = sqlite3.connect(path + 'database.sqlite')

#read into a data frame
df = pd.read_sql_query("SELECT * FROM trainSearchStream, SearchInfo WHERE  trainSearchStream.SearchID = SearchInfo.SearchID;", con)

#save to file
df.to_csv(path + 'traindata.csv',index=False,encoding='utf-8')

【问题讨论】:

  • 我想它在read_sql_query 调用期间终止,而不是to_csv 调用?您知道要查询的表的大小是多少吗?你有多少内存? 40GB 不适合典型笔记本电脑的内存。
  • 顺便说一句,如果您上面的唯一目标是将数据导出到 csv,那么可能有比往返 python 更好的方法来做到这一点。参见例如stackoverflow.com/questions/6076984/…
  • 几个问题:您的查询结果的大小是多少? (你可以在 python 之外的其他地方执行它)你知道你的 python 是 32 位还是 64 位?我猜您的查询结果会加载到 RAM 中,而您不太可能拥有 40GB 的 RAM。也许它超过 2GB,而您使用的是 32 位版本,这会导致问题。
  • 我不是 python 人,所以我不知道你的代码到底做了什么,但我认为 pd.read_sql_query 会将你的查询结果加载到内存中。在这种情况下,由于结果的大小,这不是一个好主意。我会流式传输查询,而不是逐行编写 csv。对于小的结果,这种方式会更慢。
  • @joris 是的,它在 to_csv 之前终止。我有一台具有 16Gb 内存和 500Gb 闪存的笔记本电脑。我也有 .tsv 格式的表格。在该格式中,它们的大小为 9.47Gb 和 11.02 Gb。我的目标是根据一个公共列连接几个表,然后将它们导出到一个 cvs 文件。我尝试了熊猫合并功能。但我的代码会终止。当我在终端运行 pandas 代码时,我收到一条消息:'killed: 9'

标签: python sql pandas sqlite


【解决方案1】:

如前所述,我认为最好的方法是直接使用 sqlite 而不是 python。

所以我想解决方案是this

sqlite> .mode csv
sqlite> .output test.csv
sqlite> SELECT * FROM trainSearchStream, SearchInfo WHERE  trainSearchStream.SearchID = SearchInfo.SearchID; /*your query here*/
sqlite> .output stdout

对不起,这不是一个答案,但用代码评论会破坏缩进,我们正在使用 python ...

你能运行它并给我们输出吗? (打印了什么)

import pandas as pd
import sqlite3


# Create connection.
con = sqlite3.connect(path + 'database.sqlite')

try:
    df = pd.read_sql_query("SELECT * FROM trainSearchStream, SearchInfo WHERE  trainSearchStream.SearchID = SearchInfo.SearchID;", con)
    print "read_sql_query went well"
except Exception, e:
    print "read_sql_query failed: "+ str(e))

try:
    df.to_csv(path + 'traindata.csv',index=False,encoding='utf-8')
    print "to_csv went well"
except Exception, e:
    print "to_csv failed: "+ str(e))

【讨论】:

  • 代码终止,不留下任何信息。 @Pholochtairze
猜你喜欢
  • 2020-07-12
  • 2022-01-04
  • 2019-01-11
  • 1970-01-01
  • 2012-01-13
  • 2013-04-06
  • 2011-12-04
  • 1970-01-01
  • 2015-04-11
相关资源
最近更新 更多