在使用 Pandas 的 Python 中,是不是可以逐块读取 4B 行并针对内存中已经存在的 30M 行数据帧过滤每个卡盘?

Posted

技术标签:

【中文标题】在使用 Pandas 的 Python 中,是不是可以逐块读取 4B 行并针对内存中已经存在的 30M 行数据帧过滤每个卡盘?【英文标题】:In Python using Pandas, is it possible to read 4B rows chunkwise and filter each chuck against a 30M row dataframe already in memory?在使用 Pandas 的 Python 中,是否可以逐块读取 4B 行并针对内存中已经存在的 30M 行数据帧过滤每个卡盘? 【发布时间】:2020-03-15 03:31:38 【问题描述】:

在 Oracle 中有一个 4B 行的表和一个 30M 行的 CSV,两个表共享 2 列,我想在这些列上使用较小的表过滤大表。由于安全限制,我无法将 30M 行 CSV 加载到 Oracle 中并运行一个理想的连接。我也尝试在此过程中使用 SAS Enterprise Guide,但它似乎在大连接上阻塞,并且在与 Oracle 表的连接超时之前无法返回。

Python 似乎是一个可能的解决方案,但 4B 行表将不适合内存,即使减少到我需要的 6 列(每个 25 个字符下的 6 个字符串)。理想情况下,我想做以下事情:

csv_df = pd.read_csv(file_path)
result_df = (empty dataframe)
df_chunks = pd.read_sql(sql_query, con, chunksize = 10000000)
    for df_chunk in df_chunks:
      # convert chunk to dataframe
      # join chunk_dataframe to csv_df to get a filtered result
      # concatenate filtered result to result_df

dataframe result_df 将是 4B 行 Oracle 表中所有过滤行的集合。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

你可以这样做:

csv_df = pd.read_csv(file_path)
result_df = (empty dataframe)
df_chunks = pd.read_sql(sql_query, con, chunksize = 10000000)
chunk_list = []
for df_chunk in df_chunks:
    result = pd.merge(df_chunk, csv_df, on=['XXX'])
    chunk_list.append(result)
result_df = pd.concat(chunk_list)

【讨论】:

显然,4B 行对应 30M 和 10M 块,这需要一段时间。但是,这似乎确实正确地通过了块。我很受鼓舞,并感谢您的帮助。得到结果后会更新。 工作得很好,甚至让我克服了我的 Oracle 连接因连接时间过长而断开的问题!感谢您的帮助!

以上是关于在使用 Pandas 的 Python 中,是不是可以逐块读取 4B 行并针对内存中已经存在的 30M 行数据帧过滤每个卡盘?的主要内容,如果未能解决你的问题,请参考以下文章

python中利用pandas怎么处理缺省值

python - pandas - 检查数据框中是不是存在日期

确定一天是不是是 Python / Pandas 中的工作日

Python学习:如何使用pandas分析excel数据

有效地检查 Python / numpy / pandas 中的任意对象是不是为 NaN?

如何在 Python Pandas 回归模型中使用滞后时间序列变量?