几天前,我发布了一个类似的问题,但没有任何代码,现在我创建了一个测试代码,以期寻求帮助。
代码在底部。
我得到了一些数据集,其中有一堆大文件(〜100个),我想从这些文件中高效地提取特定行(在内存和速度上)。
我的代码获取了一个相关文件的列表,该代码使用[第1行]打开了每个文件,然后使用[第2行]将文件映射到了内存,对于每个文件,我都会收到一个索引列表并遍历检索到的索引相关信息(此示例为10个字节),如下所示:[3-4行],最后我用[5-6行]关闭了句柄。
binaryFile = open(path, "r+b")
binaryFile_mm = mmap.mmap(binaryFile.fileno(), 0)
for INDEX in INDEXES:
information = binaryFile_mm[(INDEX):(INDEX)+10].decode("utf-8")
binaryFile_mm.close()
binaryFile.close()
Run Code Online (Sandbox Code Playgroud)
该代码并行运行,每个文件具有数千个索引,并连续数小时连续数小时执行。
现在解决问题 -当我将索引限制为较小时,代码运行良好(意思是-当我要求代码从文件开头获取信息时)。但!当我增加索引范围时,一切都会减速到(几乎)停止,并且buff / cache内存已满(我不确定内存问题是否与减速有关)。
所以我的问题是,为什么要从文件的开头或结尾检索信息,这又有什么关系?如何克服这个问题,以便从文件的结尾即时访问信息,而又不减慢和增加缓冲/缓存的内存使用。
PS-一些数字和大小:所以我得到了约100个文件,每个文件的大小约为1GB,当我将索引限制为文件的0%-10%时,它运行良好,但是当我允许索引位于文件停止工作。
代码 -使用python 3.5在Linux和Windows上进行测试,需要10 GB的存储空间(创建3个文件,每个文件的随机字符串在3GB之内)
import os, errno, sys
import random, time
import mmap
def create_binary_test_file():
print("Creating files with 3,000,000,000 characters, takes a few seconds...")
test_binary_file1 = open("test_binary_file1.testbin", "wb")
test_binary_file2 = open("test_binary_file2.testbin", "wb")
test_binary_file3 = open("test_binary_file3.testbin", "wb")
for i in range(1000):
if i % 100 == 0 :
print("progress - ", …Run Code Online (Sandbox Code Playgroud)