Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python读取和写入大量数据_Python_Sql_Pandas - Fatal编程技术网

用Python读取和写入大量数据

用Python读取和写入大量数据,python,sql,pandas,Python,Sql,Pandas,我试图从数据库中检索大量数据(超过700万),并试图保存一个s平面文件。正在使用python代码(python调用存储过程)检索数据。但我这里有个问题。进程正在消耗大量内存,因此unix机器会自动终止进程。我正在使用read_sql_query读取数据,并将其写入到平面文件中。所以,我想问是否有办法解决这个问题。可能一次只读取几千行并保存它们,然后转到下一行。 我甚至还使用了chunksize参数。但它似乎并没有解决这个问题 任何帮助或建议都将不胜感激。与其使用pandas库,不如直接建立数据库

我试图从数据库中检索大量数据(超过700万),并试图保存一个s平面文件。正在使用python代码(python调用存储过程)检索数据。但我这里有个问题。进程正在消耗大量内存,因此unix机器会自动终止进程。我正在使用read_sql_query读取数据,并将其写入到平面文件中。所以,我想问是否有办法解决这个问题。可能一次只读取几千行并保存它们,然后转到下一行。 我甚至还使用了chunksize参数。但它似乎并没有解决这个问题


任何帮助或建议都将不胜感激。

与其使用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方法。非常感谢。这正是我要找的。谢谢你的帮助。