在使用 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 中的工作日