为什么numpy.save不立即保存?能否强制numpy、shelve立即写入文件?
问题核心原因
所有写入不立即落盘的本质是两层缓冲:Python层面的文件对象缓冲 + 操作系统内核的页缓存,默认不会每写一次就主动同步到磁盘,只有缓冲满、文件关闭、进程退出时才会批量落盘,和numpy、shelve本身的逻辑无关。
各场景解决方法
numpy数组强制立即落盘
不要直接给np.save传递文件路径,手动管理文件句柄,写入完成后主动触发同步即可实现写完立刻落盘,支持直接覆盖写入的需求:
import os import numpy as np def save_now(file_path, arr): # wb为二进制覆盖写入模式 with open(file_path, 'wb') as f: np.save(f, arr) # 清空Python层面的文件缓冲 f.flush() # 强制把操作系统页缓存的内容写入物理磁盘 os.fsync(f.fileno())
调用时直接执行save_now("目标文件路径.npy", 待保存的numpy数组)即可。
shelve 写入不生效的修复
现有代码的问题是shelve.open打开后没有主动调用close(),所有写入内容都暂存在内存中没有落盘,修改后的代码如下:
import shelve global function_calls file = 'function_inputs' + str(function_calls) # 用with上下文管理器会自动执行close操作,无需手动处理 with shelve.open(file, 'n') as function_shelf: for key in dir(): function_shelf[key] = locals()[key] function_calls += 1
如果不想用上下文管理器,也可以在写入完成后额外加一行function_shelf.close()。
print 立即输出的简化方案
你自定义的printnow逻辑是可行的,也可以直接用Python内置print的flush参数,不需要额外封装函数:
print("待输出内容", flush=True)
即使输出内容被重定向到日志文件,该参数也会强制立刻写入磁盘。
服务器运行额外注意事项
通过Putty下发长期运行任务时,建议搭配tmux/screen或者nohup命令启动任务,避免Putty断连导致进程被系统终止,丢失长时间运行的任务进度。
内容的提问来源于stack exchange,提问作者J.D.
相关产品推荐
相关产品推荐

