流式镶木地板文件python并且仅下采样
Posted
技术标签:
【中文标题】流式镶木地板文件python并且仅下采样【英文标题】:Streaming parquet file python and only downsampling 【发布时间】:2019-05-29 06:09:40 【问题描述】:我有镶木地板格式的数据,它太大而无法放入内存 (6 GB)。我正在寻找一种使用 Python 3.6 读取和处理文件的方法。有没有办法流式传输文件、下采样并保存到dataframe
?最终,我希望使用 dataframe
格式的数据。
在不使用 spark 框架的情况下尝试执行此操作是错误的吗?
我曾尝试使用 pyarrow
和 fastparquet
,但在尝试读取整个文件时出现内存错误。
任何提示或建议将不胜感激!
【问题讨论】:
【参考方案1】:Spark 无疑是完成这项任务的可行选择。
我们计划今年在pyarrow
中添加流式读取逻辑(2019 年,请参阅https://issues.apache.org/jira/browse/ARROW-3771 和相关问题)。同时,我建议一次读取一个行组以减轻内存使用问题。您可以使用pyarrow.parquet.ParquetFile
及其read_row_group
方法来做到这一点
【讨论】:
感谢您的提示!我使用'num_row_groups'查询了文件,我的文件只有1个'row_group'。我认为这意味着我不会通过使用“read_row_group”获得任何好处? 不,当您编写包含多个行组的 Parquet 文件时,您只会从中受益。当使用pyarrow
编写它们时,您应该将chunk_size
参数设置为适合RAM 的行数。但请注意,您将此参数设置得越小,读取速度就越慢。您可能最好将其设置为 chunk_size=len(table) / 60
,以便获得 100 MiB 块。
感谢您的建议,但我无法控制镶木地板文件格式。我认为我唯一的选择是使用 pyspark/spark 进行设置?【参考方案2】:
这不是答案,我在这里发帖是因为这是我可以在 *** 上找到的唯一相关帖子。我正在尝试使用 read_row_group
函数,但 python 只会以代码 139 退出。没有其他错误消息,不知道如何解决这个问题..
from pyarrow.parquet import ParquetFile
path = "sample.parquet"
f = ParquetFile(source = path)
print(f.num_row_groups) # it will print number of groups
# if I read the entire file:
df = f.read() # this works
# try to read row group
row_df = f.read_row_group(0)
# I get
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
Python 版本 3.6.3
pyarrow 版本 0.11.1
【讨论】:
请提出一个新问题。以上是关于流式镶木地板文件python并且仅下采样的主要内容,如果未能解决你的问题,请参考以下文章
拥有一个大的镶木地板文件还是拥有许多较小的镶木地板文件更好?