You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速循环加载含字符串列与浮点列的NumPy数组?

分析与解决:npy文件加载速度忽快忽慢的问题

首先,你遇到的这个速度差异,核心原因几乎可以肯定是**文件系统缓存(包括操作系统页缓存和Google Drive的本地缓存)**在起作用,结合你用的是Google Colab挂载的Drive存储,具体拆解如下:

为什么重启后加载速度骤降?

当你第一次读取Drive上的1GB文件时,数据需要从Google的云端服务器传输到Colab实例的本地存储/内存中,这个过程受网络带宽和磁盘IO限制,所以耗时15秒左右。但一旦读取过一次,操作系统会把文件内容缓存到内存的页缓存里,同时Colab对挂载的Drive也有本地临时缓存机制——后续再读取时,直接从内存/本地缓存拿数据,不用再走网络,所以速度能降到1秒以内。

而你说“中断代码后重启,耗时从15秒变1秒”,大概率是因为之前的代码运行时,内存被其他进程占满,导致缓存被系统回收了,每次循环都得重新从云端拉取;重启Colab实例后,内存空闲,第一次读取后缓存被保留,后续循环就直接命中缓存了。

如何复现两种情况?

复现快速加载(1秒内)

  • 方法一:在循环开始前,先手动执行一次加载操作,让系统把文件缓存到内存里:
    # 预加载一次,触发缓存
    cp.load('/content/drive/My Drive/Share/Daily Data/Chunks/dataArray.npy', allow_pickle=True)
    # 再进入循环
    for ...:
        data = cp.load(...)
    
  • 方法二:重启Colab实例后,先单独运行一次加载代码,再启动循环——此时内存空闲,缓存能稳定保留。
  • 额外注意:用!free -h查看实例内存使用情况,确保有足够空闲内存(至少1.5GB以上,因为你的文件是1GB),避免缓存被系统回收。

复现慢速加载(15秒左右)

  • 方法一:手动清空操作系统的页缓存,强制重新从磁盘/云端读取:
    !sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
    
    执行完这条命令后再加载文件,就会回到15秒的耗时。
  • 方法二:故意占满实例内存,比如加载几个大文件,让系统把之前的缓存挤出去,再读取目标文件。

优化建议(即使必须每次加载)

既然你说无法规避每次循环都加载,那可以试试这两个方案让速度稳定:

  1. 把文件复制到Colab本地磁盘:Drive是网络存储,IO速度不稳定,把文件复制到/content/目录下(Colab的本地磁盘),后续从本地读取,速度会快很多且稳定:
    # 只需要执行一次复制
    !cp '/content/drive/My Drive/Share/Daily Data/Chunks/dataArray.npy' /content/
    
    循环里改成:
    data = cp.load('/content/dataArray.npy', allow_pickle=True)
    
  2. 如果文件内容不会在循环间修改:虽然你说必须每次加载,但如果文件是静态的,其实可以在循环外加载一次,每次循环复制数组即可(比如data = loaded_data.copy()),这样能彻底避免重复加载的耗时——如果是因为文件会被外部修改才必须每次加载,那这条忽略。

内容的提问来源于stack exchange,提问作者lara_toff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:43:13