如何输出数据集映射?3GB大CSV内存问题与索引CSV开发问询
大CSV处理与数据集映射解决方案
嘿,我来帮你搞定这两个问题——首先是3GB大CSV导致的内存错误,然后是数据集映射输出和编号查询程序的实现。
一、解决大CSV内存错误:分块生成二级索引文件
你遇到的内存问题,本质是pandas默认会把整个CSV加载到内存里,3GB的文件远超普通内存的承载能力。所以我们改用分块读取的方式,逐块处理数据,同时记录每个表格的起止行号,生成一个轻量的二级索引CSV,这样后续查询完全不需要碰原大文件。
这里给你优化后的代码,你可以根据自己的数据逻辑调整分界判断条件:
import pandas as pd # 分块大小(根据你的内存情况调整,比如1万行一块) chunk_size = 10000 # 二级索引文件的保存路径 index_csv_path = "table_index.csv" # 用来存储每个表格的关键信息:数据集编号、表格编号、起始行、结束行 table_indices = [] # 分块读取原大CSV for chunk_idx, chunk in enumerate(pd.read_csv( r"C:\Users\K\csvsectionofdata.csv", names=["A","B","C","D"], chunksize=chunk_size )): current_table_start = None # 遍历块内每一行,计算全局行号(避免分块导致的行号重置) for row_idx_in_chunk, row in chunk.iterrows(): global_row = chunk_idx * chunk_size + row_idx_in_chunk # --- 这里需要你根据实际数据逻辑调整!--- # 举个例子:假设D列值为1代表新表格的开始 if row['D'] == 1: # 如果已有正在记录的表格,先把上一个表格的结束行记录下来 if current_table_start is not None: table_indices.append({ "dataset_id": row['A'], # 假设A列是数据集编号,按需修改 "table_id": row['B'], # 假设B列是表格编号,按需修改 "start_row": current_table_start, "end_row": global_row - 1 }) # 记录新表格的起始行 current_table_start = global_row # 处理块内最后一个未闭合的表格 if current_table_start is not None: table_indices.append({ "dataset_id": chunk.iloc[-1]['A'], "table_id": chunk.iloc[-1]['B'], "start_row": current_table_start, "end_row": chunk_idx * chunk_size + len(chunk) - 1 }) # 将索引列表保存为二级CSV pd.DataFrame(table_indices).to_csv(index_csv_path, index=False) print(f"二级索引文件已生成:{index_csv_path}")
二、输出数据集映射&实现编号查询程序
1. 输出数据集-表格映射关系
刚才生成的二级索引文件已经包含了完整的映射信息,如果需要单独提取“数据集编号→对应表格编号”的映射,可以用这段代码生成一个更简洁的映射文件:
index_df = pd.read_csv(index_csv_path) # 按数据集分组,整理每个数据集对应的所有表格编号 dataset_mapping = index_df.groupby("dataset_id")["table_id"].apply(list).reset_index() dataset_mapping.to_csv("dataset_table_mapping.csv", index=False) print("数据集-表格映射文件已生成")
2. 编写查询程序:输入数据集编号获取表格编号
现在有了轻量的二级索引文件,查询就非常简单了,完全不会有内存压力:
def get_table_ids(dataset_id): index_df = pd.read_csv(index_csv_path) # 过滤出对应数据集的所有表格编号(去重避免重复) table_ids = index_df[index_df["dataset_id"] == dataset_id]["table_id"].unique().tolist() if not table_ids: return f"未找到数据集编号{dataset_id}对应的表格" return f"数据集{dataset_id}对应的表格编号:{', '.join(map(str, table_ids))}" # 示例使用 input_dataset_id = input("请输入数据集编号:") print(get_table_ids(input_dataset_id))
如果需要进一步根据表格编号直接读取原大CSV中的对应表格内容,也可以用这段扩展代码(同样不用加载整个大文件):
def get_table_content(table_id): index_df = pd.read_csv(index_csv_path) table_info = index_df[index_df["table_id"] == table_id].iloc[0] start_row = table_info["start_row"] end_row = table_info["end_row"] # 精准读取对应行的内容,跳过无关行 table_df = pd.read_csv( r"C:\Users\K\csvsectionofdata.csv", names=["A","B","C","D"], skiprows=start_row, nrows=end_row - start_row + 1 ) return table_df # 示例使用 input_table_id = input("请输入表格编号:") table_df = get_table_content(input_table_id) print(table_df.head())
内容的提问来源于stack exchange,提问作者Kevin Freiges
相关产品推荐
相关产品推荐

