np.memmap与np.fromfile性能对比及安全加载大型.bin文件的疑问
能否安全使用np.memmap加载大型.bin文件?
答案是完全可以安全使用,只要正确设置模式并理解内存映射的工作机制,不会出现意外问题。下面具体解释:
内存映射 vs 直接读取的核心区别
- np.fromfile:一次性将整个文件内容读取到内存中,生成独立的numpy数组。这种方式简单直接,但处理超大文件时会瞬间占用大量内存,甚至触发内存不足。
- np.memmap:创建一个映射到磁盘文件的数组对象,初始阶段不会把整个文件加载到内存,只有访问数组具体元素时,才会按需从磁盘读取对应数据块。这种方式更适配大型文件,能显著降低内存占用,也是你测试中CPU占用更低、速度更快的核心原因。
关于“生成额外文件”的误解
只有在特定场景下才会涉及额外文件:
- 使用只读模式(mode='r'):仅读取原文件,不会修改它,也不会生成任何额外文件,完全安全。
- 使用**拷贝模式(mode='c')**并修改数组:修改内容会被保存到临时文件中,原文件不受影响,关闭数组对象后临时文件会自动清理。
- 使用**读写模式(mode='r+'/'w+')**并修改数组:修改会直接写入原文件,不会生成额外文件,但可能破坏原数据(只读场景建议用
mode='r')。
你的测试代码中用了mode='r+',如果仅做读取操作,建议改成mode='r',进一步提升安全性,避免误写原文件。
性能对比数据
你对两个方法的测试结果如下(加载1000个含约400000元素的数组):
| 方法 | 均值(ms) | 中位数(ms) | 标准差(ms) |
|---|---|---|---|
| read1() | 0.6364 | 0.6204 | 0.0566 |
| read2() | 0.9435 | 0.7607 | 0.3729 |
可见np.memmap在速度稳定性和资源占用上都更优,适合处理大型.bin文件。
内容的提问来源于stack exchange,提问作者tiberius
相关产品推荐
相关产品推荐

