【问题标题】:Pandas dataframe to parquet buffer in memoryPandas 数据帧到内存中的镶木地板缓冲区
【发布时间】:2019-03-27 11:43:34
【问题描述】:

用例如下:

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

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

所以我有以下问题:

  • 如果转换在内存中完成,因为您不必处理 I/O 磁盘开销,性能会不会更好?
  • 随着您增加转换文件并将它们存储到磁盘的并发进程,我们会不会遇到磁盘问题,例如在某些时候空间不足或达到磁盘的吞吐量限制?

【问题讨论】:

    标签: python pandas performance memory-management parquet


    【解决方案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)
    
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      除非函数明确需要“文件名”,否则您可以将文件指针(fp's)替换为上面提到的缓冲区对象。

      【讨论】:

        猜你喜欢
        • 2020-03-23
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 2018-11-10
        • 1970-01-01
        • 2021-03-26
        • 2020-03-28
        • 2020-08-28
        相关资源
        最近更新 更多