我正在做非常大的数据处理(16 am ),为了处理磁盘延迟,我想尝试通过将整个文件存储在RAM中来加速操作。
我查看了现有的库,但是找不到任何能给我提供接口灵活性的东西。
理想情况下,我希望使用集成的read_line()方法,使其行为类似于标准的文件读取接口。
发布于 2022-07-21 23:43:29
Homer512在某种程度上回答了我的问题,mmap是一个很好的选择,它会导致缓存。
或者,Numpy有一些接口,可以将字节流从文件直接解析到内存中,还附带了一些与字符串相关的操作。
发布于 2022-07-19 21:35:02
只读一次文件。操作系统将为下一次读取操作缓存它。这叫页缓存。
例如,运行以下代码并查看发生了什么(将路径替换为指向系统上的一个文件):
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系统中,我得到:
duration 1 = 2.1419905399670824
duration 2 = 0.10992361599346623注意第二次读取操作有多快,即使文件已经关闭并重新打开。这是因为,在第二次读取操作中,由于Linux内核的存在,文件正在从RAM中读取。还请注意,如果再次运行此程序,您将看到这两个操作都完成得很快,因为该文件是从上一次运行中缓存的:
duration 1 = 0.10143039299873635
duration 2 = 0.08972924604313448因此,简而言之,只需使用以下代码将文件预加载到RAM中:
with open(filepath, 'rb') as f:
f.read()最后,值得一提的是,页面缓存实际上是不确定的,也就是说,您的文件可能无法完全缓存,特别是如果文件大小比RAM大的话。但是,在这种情况下,缓存文件可能是不切实际的。简而言之,默认的OS页面缓存并不是最复杂的方式,但对于许多用例来说,它已经足够了。
https://stackoverflow.com/questions/73043238
复制相似问题