2009-11-05 47 views
12

我需要閱讀的MB塊文件中,有一個更清潔的方式在Ruby中做到這一點:閱讀數據塊文件在Ruby中

FILENAME="d:\\tmp\\file.bin" 
MEGABYTE = 1024*1024 
size = File.size(FILENAME) 
open(FILENAME, "rb") do |io| 
    read = 0 
    while read < size 
    left = (size - read) 
    cur = left < MEGABYTE ? left : MEGABYTE 
    data = io.read(cur) 
    read += data.size 
    puts "READ #{cur} bytes" #yield data 
    end 
end 

回答

19

從Ruby的食譜頁面改編204:

FILENAME = "d:\\tmp\\file.bin" 
MEGABYTE = 1024 * 1024 

class File 
    def each_chunk(chunk_size = MEGABYTE) 
    yield read(chunk_size) until eof? 
    end 
end 

open(FILENAME, "rb") do |f| 
    f.each_chunk { |chunk| puts chunk } 
end 

免責聲明:我是新手,紅寶石和沒有測試。

+0

是的,這工作。但是,我認爲如果剩餘的字節數小於塊大小,IO.read會拋出。我認爲這是因爲我讀過IO.readbyte,它會拋出TruncatedDataError。看起來這不適用於閱讀。對我來說是一個過度的壓力。 謝謝! – teleball 2009-11-05 19:11:24

-1
FILENAME="d:/tmp/file.bin" 

class File 
    MEGABYTE = 1024*1024 

    def each_chunk(chunk_size=MEGABYTE) 
    yield self.read(chunk_size) until self.eof? 
    end 
end 

open(FILENAME, "rb") do |f| 
    f.each_chunk {|chunk| puts chunk } 
end 

它的工作原理,mbarkhau。爲了清楚起見,我將常量定義移至File類,並添加了一些「自我」。

+2

我不會用多餘的常量兆字節,而不是:'高清each_chunk(CHUNK_SIZE = 2 ** 20)' – asaaki 2011-06-03 17:12:21

7

另外,如果你不想猴補丁File

until my_file.eof? 
    do_something_with(my_file.read(bytes)) 
end 

例如,流的上傳臨時文件到一個新的文件:

# tempfile is a File instance 
File.open(new_file, 'wb') do |f| 
    # Read in small 65k chunks to limit memory usage 
    f.write(tempfile.read(2**16)) until tempfile.eof? 
end 
0

如果你看看紅寶石文檔: http://ruby-doc.org/core-2.2.2/IO.html 有這樣一行:

IO.foreach("testfile") {|x| print "GOT ", x } 

唯一警告是。因爲,這個過程可以讀取臨時文件比發電 流快,IMO,等待時間應該是拋出

IO.foreach("/tmp/streamfile") {|line| 
    ParseLine.parse(line) 
    sleep 0.3 #pause as this process will discontine if it doesn't allow some buffering 
} 
1

您可以使用IO#each(sep, limit),並設置sepnil或空字符串,例如:

chunk_size = 1024 
File.open('/path/to/file.txt').each(nil, chunk_size) do |chunk| 
    puts chunk 
end 
+0

這是絕對錯誤的。提醒我 – 2016-12-09 23:42:18

+1

@EricDuminil謝謝,我忘了九月的說法。它應該現在以塊的形式讀取一個文件。 – 2016-12-10 07:54:58