2014-11-08 35 views
1

什麼是從標準輸入讀取並輸出每第n個字節的最簡單有效的方法? 我想要一個在OS X上運行的命令行工具,並且寧願避免compiled languages輸出標準輸入的每第n個字節

這Python腳本是相當慢(25秒爲一個3GB的文件,當n = 100000000):

#!/usr/bin/env python 
import sys 
n = int(sys.argv[1]) 
while True: 
    chunk = sys.stdin.read(n) 
    if not chunk: 
     break 
    sys.stdout.write(chunk[0]) 

不幸的是,我們不能使用sys.stdin.seek避免讀取整個文件。

編輯:我想優化的情況下,當n是文件大小的重要部分。例如,我經常使用此實用程序在大文件中以等間距位置對500個字節進行採樣。

+0

只需讀取系統上的3GB文件需要多長時間? (確保它不在磁盤緩存中) – NPE 2014-11-08 23:03:32

+0

讀取整個文件很慢,但我對n很大的情況感興趣。例如,我想從二進制文件中抽取500個字節。 – tba 2014-11-08 23:12:06

+0

這並不一定會增加太多。例如,讀取磁盤上的每個第500個字節的文件很可能與讀取整個文件一樣慢。 – NPE 2014-11-08 23:19:30

回答

1

注意:OP改變從100到100000000的示例中,n有效地使我的代碼慢於他的,一般情況下我只是刪除我的回答,因爲它不再是比原來的例子更好,但我的回答得到了一票所以我會保持原樣。


,我能想到的,使其更快的唯一途徑是閱讀一切在一次和使用切片

#!/usr/bin/env python 
import sys 
n = int(sys.argv[1]) 
data = sys.stdin.read() 
print(data[::n]) 

雖然,要滿足一個3GB的文件到RAM可能是一個非常壞主意

+1

你認爲這會比原來更快的原因是什麼? – NPE 2014-11-08 23:17:51

+0

你不會調用讀取和檢查每個循環是否不是塊 – 2014-11-08 23:19:43

+0

這隻會有助於如果這是瓶頸,並且幾乎可以肯定是其他地方(磁盤I/O)。 – NPE 2014-11-08 23:21:39