首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存中用于缓存大型文件的Python文件

内存中用于缓存大型文件的Python文件
EN

Stack Overflow用户
提问于 2022-07-19 20:38:59
回答 2查看 174关注 0票数 0

我正在做非常大的数据处理(16 am ),为了处理磁盘延迟,我想尝试通过将整个文件存储在RAM中来加速操作。

我查看了现有的库,但是找不到任何能给我提供接口灵活性的东西。

理想情况下,我希望使用集成的read_line()方法,使其行为类似于标准的文件读取接口。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-21 23:43:29

Homer512在某种程度上回答了我的问题,mmap是一个很好的选择,它会导致缓存。

或者,Numpy有一些接口,可以将字节流从文件直接解析到内存中,还附带了一些与字符串相关的操作。

票数 0
EN

Stack Overflow用户

发布于 2022-07-19 21:35:02

只读一次文件。操作系统将为下一次读取操作缓存它。这叫页缓存

例如,运行以下代码并查看发生了什么(将路径替换为指向系统上的一个文件):

代码语言:javascript
复制
import time

filepath = '/home/mostafa/Videos/00053.MTS'
n_bytes = 200_000_000  # read 200 MB

t0 = time.perf_counter()
with open(filepath, 'rb') as f:
    f.read(n_bytes)
t1 = time.perf_counter()
with open(filepath, 'rb') as f:
    f.read(n_bytes)
t2 = time.perf_counter()

print(f'duration 1 = {t1 - t0}')
print(f'duration 2 = {t2 - t1}')

在我的Linux系统中,我得到:

代码语言:javascript
复制
duration 1 = 2.1419905399670824
duration 2 = 0.10992361599346623

注意第二次读取操作有多快,即使文件已经关闭并重新打开。这是因为,在第二次读取操作中,由于Linux内核的存在,文件正在从RAM中读取。还请注意,如果再次运行此程序,您将看到这两个操作都完成得很快,因为该文件是从上一次运行中缓存的:

代码语言:javascript
复制
duration 1 = 0.10143039299873635
duration 2 = 0.08972924604313448

因此,简而言之,只需使用以下代码将文件预加载到RAM中:

代码语言:javascript
复制
with open(filepath, 'rb') as f:
    f.read()

最后,值得一提的是,页面缓存实际上是不确定的,也就是说,您的文件可能无法完全缓存,特别是如果文件大小比RAM大的话。但是,在这种情况下,缓存文件可能是不切实际的。简而言之,默认的OS页面缓存并不是最复杂的方式,但对于许多用例来说,它已经足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73043238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档