【问题标题】:Reading large database table into Dask dataframe将大型数据库表读入 Dask 数据框
【发布时间】:2023-03-29 19:04:01
【问题描述】:

我有一个 7GB 的 postgresql 表,我想将其读入 python 并进行一些分析。我不能为此使用 Pandas,因为它比我本地机器上的内存大。因此,我想先尝试将表格读入 Dask Dataframe,执行一些聚合并切换回 Pandas 进行后续分析。为此,我使用了以下代码行。

df = dd.read_sql_table('table_xyz', uri = "postgresql+psycopg2://user:pwd@remotehost/dbname", index_col = 'column_xyz', schema = 'private')

index_col 即“column_xyz”在数据库中被索引。这可行,但是当我执行聚合等操作时,需要很长时间(比如一个小时)才能返回结果。

avg = df.groupby("col1").col2.mean().compute()

我知道 Dask 不如 Pandas 快,所以当我在单台机器上而不是集群上工作时。我想知道我是否以正确的方式使用 Dask?如果不是使用 Python 对不适合内存的大型表执行分析的更快替代方法。

【问题讨论】:

    标签: python pandas dask-dataframe


    【解决方案1】:

    如果您的数据适合您机器的 RAM,那么您最好使用 Pandas。在某些情况下,Dask 不会胜过 Pandas。 或者,您可以使用 chunksize 并查看情况是否有所改善。解决这个问题的最佳方法是查看 dask 诊断工具仪表板并找出 dask 需要这么长时间的原因。这将帮助您做出更明智的决定。

    【讨论】:

    • 您能否参考任何详细解释 Dask.dataframe 块大小的链接。我找不到任何关于块大小选择的深入资源。
    • 我刚刚意识到,块大小不与 read_sql_table 一起使用,因为您需要使用索引列进行分区。此外,您正在使用 pandas 数据框计算平均值,因此您没有为此利用 dask。尝试使用 dask 数据框(与 pandas 非常相似的命令)计算平均值并检查诊断仪表板。
    • 感谢您的 cmets。我将 'bytes_per_chunk' 参数和强制的 'index_col' 参数设置为 30MB,这很有帮助。现在该动作在 9 分钟内完成,这是可以接受的。
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多