python - 将多个镶木地板文件加载到数据框中进行分析
问题描述
我有几个 .parquet 文件,每个文件的形状(1126399, 503)
和大小为 13MB。据我所知和我所读到的,这应该可以在本地机器上很好地处理。我正在尝试将它们放入 pandas 数据框以运行一些分析,但这样做时遇到了麻烦。将它们保存到 CSV 文件的成本太高,因为文件变得非常大并将它们直接加载到多个数据帧中,然后连接会给我带来内存错误。我从未使用过 .parquet 文件,也不确定最佳的前进路径是什么,或者如何使用这些文件对数据进行实际分析。
起初,我尝试过:
import pandas as pd
import pyarrow.parquet as pq
# This is repeated for all files
p0 = pq.read_table('part0.parquet') # each part increases python's memory usage by ~14%
df0 = part0.to_pandas() # each frame increases python's memory usage by additional ~14%
# Concatenate all dataframes together
df = pd.concat([df0, df1, df2, df3, df4, df6, df7], ignore_index=True)
这导致我内存不足。我在具有 12 个内核和 32GB 内存的系统上运行。我认为我会更有效率并尝试循环并删除不再需要的文件:
import pandas as pd
# Loop through files and load into a dataframe
df = pd.read_parquet('part0.parquet', engine='pyarrow')
files = ['part1.parquet', 'part2.parquet', 'part3.parquet'] # in total there are 6 files
for file in files:
data = pd.read_parque(file)
df = df.append(data, ignore_index=True)
del data
不幸的是,这些都不起作用。非常感谢任何和所有帮助。
解决方案
我打开了https://issues.apache.org/jira/browse/ARROW-3424关于至少在 pyarrow 中创建一个函数,该函数将尽可能有效地加载文件路径的集合。您可以使用 单独加载它们pyarrow.parquet.read_table
,使用 连接pyarrow.Table
对象pyarrow.concat_tables
,然后调用Table.to_pandas
转换为pandas.DataFrame
。这将比与 pandas 连接更有效
推荐阅读
- binary-search-tree - 为什么我们需要为红黑树中的每个节点存储一个父指针?
- java - 如何避免 OpenApi & Java 中的额外输入请求?
- azure - Azure 中的 Microsoft Bot 是否需要任何特定权限才能写入表存储?
- firebase - 我可以更改保存在 Firestore 时间戳字段中的时区吗?
- android - 我的按钮单击侦听器不起作用,并且没有发生错误
- reactjs - npx amplify-app@latest 未能创建 Base Amplify 项目
- mysql - SQL 结果重复条目
- php - PHP:不等于不生效
- properties - 将 Cppcheck 和 VCL 结合在一起
- python - 如何在 SqlServer 中以编程方式生成表的 DDL?