用Python读取和写入大量数据
我试图从数据库中检索大量数据(超过700万),并试图保存一个s平面文件。正在使用python代码(python调用存储过程)检索数据。但我这里有个问题。进程正在消耗大量内存,因此unix机器会自动终止进程。我正在使用read_sql_query读取数据,并将其写入到平面文件中。所以,我想问是否有办法解决这个问题。可能一次只读取几千行并保存它们,然后转到下一行。 我甚至还使用了chunksize参数。但它似乎并没有解决这个问题用Python读取和写入大量数据,python,sql,pandas,Python,Sql,Pandas,我试图从数据库中检索大量数据(超过700万),并试图保存一个s平面文件。正在使用python代码(python调用存储过程)检索数据。但我这里有个问题。进程正在消耗大量内存,因此unix机器会自动终止进程。我正在使用read_sql_query读取数据,并将其写入到平面文件中。所以,我想问是否有办法解决这个问题。可能一次只读取几千行并保存它们,然后转到下一行。 我甚至还使用了chunksize参数。但它似乎并没有解决这个问题 任何帮助或建议都将不胜感激。与其使用pandas库,不如直接建立数据库
任何帮助或建议都将不胜感激。与其使用pandas库,不如直接建立数据库连接(根据需要使用psycopg2、pymysql、pyodbc或其他连接器库),并使用Python的db api同时读写行,一个接一个或以任何大小的块进行处理。在
read\u sql\u query
中使用chunksize
时,可以对结果进行迭代,以避免将所有内容一次加载到内存中。但是,您还必须分块写入CSV文件,以确保不只是将查询结果逐块复制到新的、巨大的DataFrame
。注意只写一次列标题。以下是使用熊猫的示例:
import pandas as pd
dbcon = ... # whatever
with open("out.csv", "w") as fh:
chunks = pd.read_sql_query("SELECT * FROM table_name", dbcon, chunksize=10000)
next(chunks).to_csv(fh, index=False) # write the first chunk with the column names,
# but ignore the index (which will be screwed up anyway due to the chunking)
for chunk in chunks:
chunk.to_csv(fh, index=False, header=False) # skip the column names from now on
如果在调用
read\u sql\u query
熊猫数据帧时显式设置index\u col
,则在编写CSV时不必忽略索引,如果数据是时间序列和/或需要修改,我将使用@PaSTE建议的read\u sql\u query()
但是,如果您决定简单地从数据库读取数据,并立即将数据处理为另一种格式,并且您对使用一些Python原语感到满意,那么我只需利用“原始”内置DB-API(熊猫正在使用相同的API)并像这样逐行读取:
import MySQLdb
db = MySQLdb.connect(host='hostname', user='john', passwd='doe', db='penguins')
cursor = db.cursor()
cursor.execute(f"SELECT * FROM your_table;")
for row in cursor:
print(row)
import MySQLdb
db = MySQLdb.connect(host='hostname', user='john', passwd='doe', db='penguins')
cursor = db.cursor()
cursor.execute("SELECT COUNT(*) FROM your_table")
row_count = cursor.fetchone()[0]
chunk_size = 1000
for offset in range(0, row_count, chunk_size):
cursor.execute(f"SELECT * FROM your_table LIMIT {chunk_size} OFFSET {offset};")
for row in cursor:
print(row)
或者像这样使用块:
import MySQLdb
db = MySQLdb.connect(host='hostname', user='john', passwd='doe', db='penguins')
cursor = db.cursor()
cursor.execute(f"SELECT * FROM your_table;")
for row in cursor:
print(row)
import MySQLdb
db = MySQLdb.connect(host='hostname', user='john', passwd='doe', db='penguins')
cursor = db.cursor()
cursor.execute("SELECT COUNT(*) FROM your_table")
row_count = cursor.fetchone()[0]
chunk_size = 1000
for offset in range(0, row_count, chunk_size):
cursor.execute(f"SELECT * FROM your_table LIMIT {chunk_size} OFFSET {offset};")
for row in cursor:
print(row)
这不是特定于驱动程序的,而且我所知道的所有驱动程序都可以这样做,所以请使用您喜欢的驱动程序
享受吧 您正在使用什么RDBMS?大多数都有CSV方法。非常感谢。这正是我要找的。谢谢你的帮助。