熊猫数据帧到内存中的实木复合地板缓冲区

时间:2018-10-23 09:27:27

标签: python pandas performance memory-management parquet

用例如下:

  1. 从外部数据库读取数据并将其加载到pandas数据框
  2. 将该数据帧转换为拼花格式缓冲区
  3. 将该缓冲区上传到s3

我一直在尝试在内存中执行第二步(无需将文件存储到磁盘即可获得拼花格式),但是到目前为止,我所见过的所有库始终将它们写入磁盘。

所以我有以下问题:

  • 如果不必在内存中完成转换,那么转换性能会更好吗?
  • 随着您增加将文件转换并将其存储到磁盘的并发进程,我们难道就不会遇到磁盘问题,例如某些时候空间不足或达到磁盘的吞吐量限制吗?

2 个答案:

答案 0 :(得分:1)

Apache Arrowpyarrow库应该解决此问题,并在内存中进行很多处理。在pandas中,您可以通过pyarrow读取/写入镶木地板文件。

一些示例代码也利用了smart_open

import pandas as pd
import boto3
from smart_open import open
from io import BytesIO

s3 = boto3.client('s3')

# read parquet file into memory
obj = s3.get_object(Bucket=bucket, Key=key)
df = pd.read_parquet(BytesIO(obj['Body'].read()), engine='pyarrow')

# do stuff with dataframe

# write parquet file to s3 out of memory
with open(f's3://{outputBucket}/{outputPrefix}{additionalSuffix}', 'wb') as out_file:
    df.to_parquet(out_file, engine='pyarrow', index=False)

答案 1 :(得分:0)

  

如果转换是在内存中完成的,因为您不必处理I / O磁盘开销,会不会有更好的表现?

是的,会的。为此,您可以使用BytesIO对象(或StringIO),该对象可以代替文件描述符使用。如果您使用的是pyarrow,则有NativeFile

  

随着您增加将文件转换并将其存储到磁盘的并发进程,我们难道就不会遇到磁盘问题,例如某些时候空间不足或达到磁盘的吞吐量限制吗?

也是如此,但这是对文件系统(包括数据库)的任何读/写的限制。通过确保在处理完文件后将其删除,可以节省磁盘空间。另外,除非您要处理大量磁盘数据或SQL语句,否则您很可能会在达到磁盘吞吐量限制之前达到带宽限制。

  

...但是到目前为止我所见过的所有库,它们总是写入磁盘。

除非函数明确需要一个“文件名”,否则您可以如上所述用缓冲区对象替换文件指针(fp)。