【问题标题】:How to limit RAM consumption in SQLAlchemy + Pandas operations?如何限制 SQLAlchemy + Pandas 操作中的 RAM 消耗?
【发布时间】:2020-05-11 21:03:11
【问题描述】:

我们有几个进程使用 SQLAlchemy 从数据库中提取数据,然后使用 Pandas 来操作数据。我在我的 sql 中将cast() 拉到更小的数据类型吗?还是我作为较小的数据类型加载到我的数据框中?

df = pd.read_sql("select cast(column_name as smallint) from schema.table;")

df = pd.read_sql("select column_name from schema.table;", dtype={"column_name": "int8"})

有没有办法改变默认的熊猫数字类型。好像默认int64

【问题讨论】:

  • 查询通常返回多少行?在典型情况下,您需要这些行的全部还是大部分?如果没有,您是否考虑过尝试编写更具体的查询?另外,根据架构,数据库中实际存储的数据类型是什么?
  • 所以我们实际上有许多类似的过程作为 diff etl 作业的一部分。我的目标是制定一些更好的实践来限制我们的云成本。大多数情况下,我们确切地知道查询需要哪些列,但是每天和不同工作的行数/数据大小存在差异。

标签: python pandas memory sqlalchemy


【解决方案1】:

因此,在环顾四周之后,似乎加载不同的默认 dtype 并不是超级可行的,除非您想单独指定每一列,或者想要 cast() sql 中的每一列。即使那样,确保您不会丢失任何数据也是另一个问题。总的来说,我认为这个问题在所有流程中都通过更严格的标准得到解决,而不是灵丹妙药(duh)。

与此同时,这将有助于在加载后安全地向下转换列。读取功能仍然使用大部分 RAM,但对于下游操作,需要此课程空间:

def downcast_integers(df: pd.DataFrame) -> pd.DataFrame:
    """
    Args:
        df:
    Returns:
    """
    int_columns = df.select_dtypes(include=["int64"]).columns.tolist()
    df[int_columns] = df[int_columns].apply(pd.to_numeric, downcast='integer')
    return df

浮点和对象类型可以类似地完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多