[英]Parallel Disk I/O
我有幾個我想閱讀的日志文件。 不失一般性,讓我們說日志文件處理如下:
def process(infilepath):
answer = 0
with open (infilepath) as infile:
for line in infile:
if line.startswith(someStr):
answer += 1
return answer
由於我有很多日志文件,我想在這個問題上拋出多處理(我的第一個錯誤:我應該使用多線程;有人請告訴我原因)
在這樣做的時候,我想到任何形式的並行處理在這里都應該沒用,因為我受到硬盤上只有一個讀頭的限制,因此,只能讀取一個文件。時間。 實際上,在這種推理下,由於可以同時請求來自不同文件的行的事實,讀頭可能需要不時地移動,導致多過程方法比串行方法慢。 所以我決定回到一個進程來讀取我的日志文件。
有趣的是,我注意到我確實得到了一個帶有小文件(<= 40KB)的加速,並且只有大文件(> = 445MB)才注意到預期的減速。
這讓我相信python可以讀取塊中的文件,塊的大小超過我一次請求的一行。
Q1:那么引擎蓋下的文件讀取機制是什么?
Q2:優化傳統硬盤文件讀取的最佳方法是什么?
技術規格:
觀察到的行為是以下結果:
根據操作系統和讀取塊大小,整個文件可以放入一個塊中,這是在單個讀取命令中讀取的塊。 這就是為什么更容易讀取較小的文件
必須以block size
塊讀取較大的文件(文件大小>讀取塊大小)。 因此,當對若干文件中的每一個請求讀取時(由於多處理),針必須移動到HDD的不同扇區(對應於文件所在的位置)。 這種重復的運動做了兩件事:
如果在讀取頭可以提供來自同一文件的下一行行之前在一行行上執行的計算完成,則連續讀取相同文件之間的時間很重要,該過程簡單地等待直到另一行可用。 這是減速的一個原因
拋出讀預測器是不好的,原因與拋棄分支預測器的原因差不多 。
由於這兩個問題的綜合影響,並行處理許多大文件比串行處理它們要慢。 當然,在處理blockSize
時,更多的情況更真實,許多行在numProcesses * blockSize
之前numProcesses * blockSize
可以從HDD中讀出許多行
另一個想法是分析你的代碼
try:
import cProfile as profile
except ImportError:
import profile
profile.run("process()")
這是使用內存映射文件的示例
import mmap
with open("hello.txt", "r+b") as f:
mapf = mmap.mmap(f.fileno(), 0)
print(mapf.readline())
mapf.close()
enter code here
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.