python-3.x - 内存不足:将大数据从 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))
解决方案
order by [column] limit [number] offset 0
1)通过合理增加和增加限制数,找到表中的行数和可以拉取的表的最大块
2)添加一个循环,该循环将产生具有您找到的限制并增加偏移量的 sql,即如果您可以提取 10k 行,您的语句将是:
... limit 10000 offset 0;
... limit 10000 offset 10000;
... limit 10000 offset 20000;
直到达到表格行数
3)在同一个循环中,将每个新获得的行集附加到您的数据框中。
ps这将起作用,假设您不会在客户端上遇到任何内存/磁盘问题,我无法保证,因为您在可能是更高级别硬件的集群上遇到此类问题。为避免该问题,您只需在每次迭代时编写一个新文件,而不是追加。
此外,整个方法可能不正确。您最好将表卸载到 S3,这非常快,因为数据是从每个节点独立复制的,然后对 S3 上的平面文件执行任何需要的操作,以将其转换为您需要的最终格式。
推荐阅读
- google-apps-script - 表格脚本根据单元格值添加行
- django - __str__ 返回非字符串(类型 takimlar)
- webgl - 为什么WebGL扩展的webidl规范有[NoInterfaceObject]扩展属性
- snmp - 以 Oid 列表作为输入的 Getbulk 操作
- c++ - GDB 漂亮的打印机子类信息
- javascript - 如何使用 javascript 访问 HTML 元素的数据属性
- .htaccess - 有人可以用简单的英语解释这个重写吗
- django - Django 模型组织:不同杂货店的食品位置
- r - 在 R 中为 networkD3 包创建列表时遇到问题
- batch-file - CMD 上的批处理脚本以获取变量上的 COM 端口