首页 > 解决方案 > 内存不足:将大数据从 Amazon Redshift 传输到 Pandas

问题描述

我在 Amazon-Redishift 中有一个大数据块(大约 1000 万行),我要在 Pandas 数据帧中获取它并将数据存储在一个 pickle 文件中。但是,由于数据的大小,它出于明显的原因显示“内存不足”异常。我尝试了很多其他的东西,比如 sqlalchemy,但是,无法解决问题。任何人都可以提出更好的方法或代码来解决它。

我当前的(简单)代码片段如下:

import psycopg2 

import pandas as pd

import numpy as np

cnxn = psycopg2.connect(dbname=<mydatabase>, host='my_redshift_Server_Name', port='5439', user=<username>, password=<pwd>)

sql = "Select * from mydatabase.mytable" 

df = pd.read_sql(sql, cnxn, columns=1)

pd.to_pickle(df, 'Base_Data.pkl')

print(df.head(50))

cnxn.close()

print(df.head(50))

标签: python-3.xpandasamazon-redshiftpicklepsycopg2

解决方案


order by [column] limit [number] offset 01)通过合理增加和增加限制数,找到表中的行数和可以拉取的表的最大块

2)添加一个循环,该循环将产生具有您找到的限制并增加偏移量的 sql,即如果您可以提取 10k 行,您的语句将是:

... limit 10000 offset 0;
... limit 10000 offset 10000;
... limit 10000 offset 20000;

直到达到表格行数

3)在同一个循环中,将每个新获得的行集附加到您的数据框中。

ps这将起作用,假设您不会在客户端上遇到任何内存/磁盘问题,我无法保证,因为您在可能是更高级别硬件的集群上遇到此类问题。为避免该问题,您只需在每次迭代时编写一个新文件,而不是追加。

此外,整个方法可能不正确。您最好将表卸载到 S3,这非常快,因为数据是从每个节点独立复制的,然后对 S3 上的平面文件执行任何需要的操作,以将其转换为您需要的最终格式。


推荐阅读