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

如何优化np.loadtxt读取大数值文件效率?避免重复读取

优化大文本文件重复读取的几种实用方案

你的痛点我太懂了——每次微调个绘图标题或者处理逻辑,都要重新解析12000行的文本文件,光读文件的时间都够喝杯咖啡了。结合你的Bash+Python工作流,给你几个针对性的优化方案:

1. 转存为二进制格式(最推荐,速度提升显著)

文本格式(比如你的.dat)虽然直观,但解析时要做大量字符串转浮点的操作,速度慢得离谱。Numpy的.npy二进制格式直接存储数组的内存结构,读取速度能快几十倍甚至上百倍。

具体实现:

  • 先写个一次性的缓存生成脚本(或者在现有Python代码里加判断逻辑),把原始.dat转成.npy:
import numpy as np
import os

root = os.environ["root"]
paths = ["1leo_5fpps_pwat", "1leo_5fpps_u8", "1leo_5fpps_u8_t4"]

for path in paths:
    dat_path = f"{root}/{path}/anal/all_frac.dat"
    npy_path = f"{root}/{path}/anal/all_frac.npy"
    # 只有当缓存不存在,或者原始文件更新时才重新生成
    if not os.path.exists(npy_path) or os.path.getmtime(dat_path) > os.path.getmtime(npy_path):
        print(f"Generating cache for {path}...")
        xf = np.loadtxt(dat_path, dtype=float)
        np.save(npy_path, xf)
  • 之后在你的contour.py里,直接读取缓存文件即可:
# 替换原来的np.loadtxt代码
xf = np.load(npy_path)

配合Bash脚本的优化:

你可以在调用绘图脚本前先检查缓存,确保缓存是最新的:

prep_cache(){
    printf "Checking and updating data cache...\n"
    python generate_cache.py
}

call_python(){
    printf "Running contour plotting script...\n"
    python contour.py
}

# 执行顺序
prep_cache
call_python

2. 拆分数据读取与处理/绘图逻辑

把代码拆成两个独立部分,彻底分离慢操作和频繁修改的部分:

  • load_data.py:专门负责读取原始文本、预处理,然后把数据保存为.npy或pickle格式的中间文件
  • plot_and_process.py:直接加载中间数据,专注于绘图标题调整、下游处理逻辑的微调

这样每次改代码时,只需要运行plot_and_process.py,完全跳过耗时的文本读取步骤。

3. 内存映射文件(适合超大规模数据)

如果你的文件大到加载到内存都有压力,可以用Numpy的内存映射功能——它会把文件的一部分映射到内存,不用一次性加载整个文件,读取速度快还省内存:

# 先保存一次内存映射格式的文件(只需要做一次)
xf = np.loadtxt(dat_path, dtype=float)
np.save(dat_path + ".npy", xf)
# 后续读取时用内存映射
xf = np.load(dat_path + ".npy", mmap_mode='r')

4. 小技巧:提前过滤无用数据

如果你的48列里不是所有列都用到,第一次读取时就只加载需要的列,减少数据量:

# 比如只加载第0、3、7列
xf = np.loadtxt(dat_path, dtype=float, usecols=(0,3,7))

这样不仅读取更快,后续的绘图和处理也会更高效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:19:18