我遇到了这个问题,当我尝试读取实木复合地板文件时,容器的内存使用量急剧增加。实木复合地板文件是使用Spark编写的,我正在尝试使用Pyarrow进行读取。
在这种特定情况下,一个10mb的实木复合地板文件的大小超过3gb。我猜想某些列的数据类型会预留大量内存,但我不确定。
这是我所看到的代码和一些屏幕截图:
写入文件的代码(Scala 2.11,spark 2.2.1,(AWS Glue)):
def write(implicit spark: SparkSession,df: DataFrame,s3Bucket: String,s3Key: String,mode: String): Boolean ={
df.write
.mode(mode)
.option("header",true)
.parquet(s3Bucket + "/" + s3Key)
true
}
}
文件写入后的架构:
读取文件的代码(pandas == 0.25.2,pyarrow == 0.15.1):
@profile
def readParquet():
srDf = pq.Parquetdataset('test.parquet').read().to_pandas()
print(srDf.info(verbose=True))
readParquet()
memory_profiler的输出:
文件本身:
读取后的文件架构:
我对为什么在pyarrow中将字符串列推断为对象类型感到困惑。我相信这就是导致所有内存增加的原因。这是少量数据,我希望在AWS lambda中对其进行处理,但是lambda具有3gb的内存限制,因此我无法在那里读取文件。我研究了尝试为pyarrow明确定义一个架构,以按如下方式读取镶木地板文件,但似乎无法正常工作。除非我忽略了某些内容,否则似乎不支持它。如果你们在我的实现中看到明显的错误,请告诉我。谢谢。