如何从大型数据库中将数据加载到pandas中?

时间:2018-05-04 12:13:08

标签: python-3.x postgresql pandas memory

我有一个包含时间序列数据的postgres数据库。数据库的大小约为1 GB。目前读取数据,这就是我的工作

import psycopg2
import pandas as pd
import pandas.io.sql as psql

conn = psycopg2.connect(database="metrics", user="*******", password="*******", host="localhost", port="5432")
cur = conn.cursor()
df = psql.read_sql("Select * from timeseries", conn)
print(df)

但是这会将整个数据加载到内存中。现在我知道可以将数据库转储到csv文件的技术,然后可以按照这里建议的块来读取csv文件How to read a 6 GB csv file with pandas

但对我来说这不是一个选项,因为数据库将不断变化,我需要动态阅读。是否有任何技术可以读取数据库内容或者使用任何第三方库?

2 个答案:

答案 0 :(得分:1)

pd.read_sql()也有参数chunksize,因此您可以从块中读取SQL表/查询中的数据:

for df in pd.read_sql("Select * from timeseries", conn, chunksize=10**4):
    # process `df` chunk here...

答案 1 :(得分:0)

考虑使用psql将此文件直接加载到数据库。从您的控制台尝试此命令:

$ cat file.csv | psql db -c "COPY your_table FROM STDIN DELIMITER ',' CSV HEADER"

示例:

考虑以下表格结构..

CREATE TEMPORARY TABLE t (foo INT, bar TEXT);

以及以下CSV文件..

x,y
1,foo
2,bar
3,foo-bar

从终端执行以下命令:

$ cat /tmp/file.csv | psql db -c "COPY t FROM STDIN DELIMITER ',' CSV HEADER"

以下是您的数据:

db=# SELECT * FROM t;
 a |    b    
---+---------
 1 | foo
 2 | bar
 3 | foo-bar
(3 Zeilen)