首页 > 解决方案 > pyarrow.parquet.write_table:内存使用情况

问题描述

我需要使用 Python 准备 .parquet 文件,所以这是我的代码:

import numpy as np
import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd
import sys
import mysql.connector
import json

def write_table(databaseServer, databaseDatabase, databaseUser, databasePassword, sql, fileName):
    result = 0;
    frame = {};
    convert_to_double = {};

    try:
        database = mysql.connector.connect(host=databaseServer, database=databaseDatabase, user=databaseUser, password=databasePassword)

        try:
            cursor = database.cursor(buffered=False)

            cursor.execute(sql)

            for desc in cursor.description:
                name = desc[0]
                type = desc[1]

                frame[name] = [];

                if mysql.connector.FieldType.get_info(type) == 'NEWDECIMAL':
                    convert_to_double[name] = True;

            records = cursor.fetchall()

            for record in records:
                i = 0;

                for name in cursor.column_names:
                    if name in convert_to_double:
                        frame[name].append(float(record[i]))
                    else:
                        frame[name].append(record[i])

                    i += 1

                result += 1;
        finally:
            cursor.close()
    finally:
        database.close()

    
    if result == 0:
        return result;
    
    df = pd.DataFrame(frame)
    table = pa.Table.from_pandas(df)
    pq.write_table(table, fileName)

    return result

问题是我在服务器上没有太多内存,但在这段代码中,我将整个 SQL 查询加载到存储在内存中的列中。此外,我无法对数据进行分区以加载更少的数据(它已经按月分区,我为 Amazon Athena 准备了 .parquet 文件)。

我的问题是:

谢谢。

标签: pythonpandasparquetpyarrow

解决方案


此刻你是:

  • 将数据加载到内存中(在向量中)
  • 将数据转换为df
  • 将数据存储在镶木地板中

只有当所有数据都可以存储在内存中时,此策略才有效。

您可以改为使用ParquetWriter将较小批量的数据写入 parquet 文件

一一回答您的问题:

  • 您可以通过使用 numpy 数组而不是 python 数组来减少内存占用。它们在内存方面效率更高。此外,您不应该调用fetchall()而是从游标流式传输记录。

  • 我认为没有办法按列编写镶木地板文件列。您可以通过编写较小的行组来解决规模问题。

  • CSV 数据表示比 parquet 或 pandas 效率低,我不确定它会不会。


推荐阅读