huaguoshanhouzi 发表于 2024-4-18 10:22

一个关于Python合并大数据量表格,内存消耗过大的求助帖

1、以下贴上代码,这个代码用于把文件夹里所有表格合并成一个表格               

2、就是这个合并是可以运行的,但是在使用测试中观察到一个问题,就是在新建的表存放的数据太大了,内存占用已经超过了物理性能,就是想请教一下,有什么办法可以缩减一下占用的内存量。我的思路就是设置一个最高上限,到达上线就保存一次,后边清空掉内存占用的部分继续追加新的表,
现在就是追加要打开表,那么内存占用又会回来。怎么才能清除内存占用,然后追加之后还能接续上。
拜谢大佬们提供一下思路或者解决方法


import openpyxl
def merge_files(file_paths, save_interval):
    try:
      # 创建一个新的工作簿和工作表
      wb_new = openpyxl.Workbook()
      ws_new = wb_new.active
      first_row = None
      counts=0
      for file_path in file_paths:
            counts += 1
            print(f"处理 {file_path}")
            if file_path.endswith('.xlsx'):
                # 读取 Excel 文件
                wb = openpyxl.load_workbook(file_path)
                ws = wb.active
               
                if first_row is None:
                  first_row = next(ws.iter_rows(min_row=1, max_row=1, values_only=True))
                  ws_new.append(first_row)
               
                # 逐行追加数据
                for row in ws.iter_rows(min_row=2, values_only=True):
                  ws_new.append(row)# 将该行数据追加到新表中
                # # 保存新文件
                # if counts % save_interval == 0:
                #   wb_new.save(f'汇总.xlsx')
                #   wb_new.close()
                #   wb_new = None
                #   ws_new = None
      # 检查已经合并的表数量,最大标准参数save_interval,如果到达最大合并上线就保存一次
      #    if counts==save_interval:
      #       counts=0
      #       wb_new.save(f'汇总.xlsx')
      #       ws_new = wb_new.active
      wb_new.save(f'汇总.xlsx')      print(f"筛选合并完成并保存至 汇总 文件夹中")
    except Exception as e:
      print(f"在处理时发生错误,错误原因:{e}")

qinqin883 发表于 2024-4-25 16:47

找了半天才找到,很受启发;感谢风险

huaguoshanhouzi 发表于 2024-4-25 16:07

你好,再见 发表于 2024-4-25 09:58
内存映射文件技术可以解决大文件操作问题,没了解过Python,你看看python有没有现成的模块可以使用

这个技术非常符合我的设计思路,谢谢,我研究研究

你好,再见 发表于 2024-4-25 09:58

内存映射文件技术可以解决大文件操作问题,没了解过Python,你看看python有没有现成的模块可以使用

huaguoshanhouzi 发表于 2024-4-23 10:21

本帖最后由 huaguoshanhouzi 于 2024-4-23 10:23 编辑

塞北的雪 发表于 2024-4-22 18:58
如果是源表过多,那你应该处理完一个xls就关闭释放内存
这个方法实验了,确实可以减少一些内存占用。

huaguoshanhouzi 发表于 2024-4-23 10:16

小邑走天下 发表于 2024-4-22 21:21
可以使用with open(paixu_xl, 'r') as file:

如果使用这个打开方式的话,我要怎么操作合并这个数据呢,就我之前使用过这个方式,打开文件的方式有些原始,文件内存仍然会占用过大

小邑走天下 发表于 2024-4-22 21:24

如果数据量达到几百万行,建议使用csv格式,或者根据文件数量新建一个表格,数据量太大合成的表打开也会丢失数据的

小邑走天下 发表于 2024-4-22 21:21

可以使用with open(paixu_xl, 'r') as file:

塞北的雪 发表于 2024-4-22 18:58

如果是源表过多,那你应该处理完一个xls就关闭释放内存

huaguoshanhouzi 发表于 2024-4-22 18:47

塞北的雪 发表于 2024-4-18 16:19
数据量大的话为什么不导出为csv文件呢

程序的内存使用量并没有减少多少,由于打开的文件就是xlsx格式的,所以就算把保存格式改成csv也影响不到内存占用。
页: [1] 2
查看完整版本: 一个关于Python合并大数据量表格,内存消耗过大的求助帖