python - pyarrow.parquet.write_table:内存使用情况
问题描述
我需要使用 Python 准备 .parquet 文件,所以这是我的代码:
import numpy as np
import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd
import sys
import mysql.connector
import json
def write_table(databaseServer, databaseDatabase, databaseUser, databasePassword, sql, fileName):
result = 0;
frame = {};
convert_to_double = {};
try:
database = mysql.connector.connect(host=databaseServer, database=databaseDatabase, user=databaseUser, password=databasePassword)
try:
cursor = database.cursor(buffered=False)
cursor.execute(sql)
for desc in cursor.description:
name = desc[0]
type = desc[1]
frame[name] = [];
if mysql.connector.FieldType.get_info(type) == 'NEWDECIMAL':
convert_to_double[name] = True;
records = cursor.fetchall()
for record in records:
i = 0;
for name in cursor.column_names:
if name in convert_to_double:
frame[name].append(float(record[i]))
else:
frame[name].append(record[i])
i += 1
result += 1;
finally:
cursor.close()
finally:
database.close()
if result == 0:
return result;
df = pd.DataFrame(frame)
table = pa.Table.from_pandas(df)
pq.write_table(table, fileName)
return result
问题是我在服务器上没有太多内存,但在这段代码中,我将整个 SQL 查询加载到存储在内存中的列中。此外,我无法对数据进行分区以加载更少的数据(它已经按月分区,我为 Amazon Athena 准备了 .parquet 文件)。
我的问题是:
- 以这种方式准备 .parquet 文件时是否可以减少内存使用量?
- 它是一种从数据库中逐列查询数据然后将所有这些列写入单个.parquet的方法吗?
- 如果我先在磁盘上写入 CSV 然后告诉 pandas 将此 .csv 转换为 .parquet 是否有助于减少内存使用?
谢谢。
解决方案
此刻你是:
- 将数据加载到内存中(在向量中)
- 将数据转换为df
- 将数据存储在镶木地板中
只有当所有数据都可以存储在内存中时,此策略才有效。
您可以改为使用ParquetWriter将较小批量的数据写入 parquet 文件
一一回答您的问题:
您可以通过使用 numpy 数组而不是 python 数组来减少内存占用。它们在内存方面效率更高。此外,您不应该调用
fetchall()
而是从游标流式传输记录。我认为没有办法按列编写镶木地板文件列。您可以通过编写较小的行组来解决规模问题。
CSV 数据表示比 parquet 或 pandas 效率低,我不确定它会不会。
推荐阅读
- reactjs - Reactjs Onclick 按钮按天、月或年排序?
- html - 4k 分辨率的网站缩放以适应较小的窗口
- reactjs - TypeError: state.items 不可迭代 React-Redux
- angular - 使用 Typescript 2.6 运行 Angular 5 应用程序的最低浏览器支持
- sql - 如何在列中的字符和数字之间进行排序
- swift - Xcode - 如何为方案使用测试计划
- python - python中关于类型作为参数的复杂注释
- c++ - C++ 入门第 5 版函数模板专业化
- python - 通过 FTP 从内存中发送 JSON 对象
- video-indexer - 如何更新 Azure 视频索引器中的缩略图?