2014-06-27 71 views
0

我有問題,而接近Binary search in a sorted (memory-mapped ?) file in Java如何做在java內存映射壓縮文件的二進制搜索?

我想要實現字符串二進制搜索中使用Java MappedByteBuffers一個大的文件,但在我的情況下,大的文件被壓縮用bzip2。假設文件是​​用-1選項100k塊壓縮的。 (其實我不知道確切的選項,但我可以重新包裝文件)。

我應該如何在這樣的MappedByteBuffer中搜索字符串?如何解壓1塊?是否有一些standart lib或我應該讀取標題,deflate節和crc?那些塊是100k壓縮狀態,還是100k它是未壓縮的數據長度?以及最後的塊如何?

有人在壓縮文件中完成BinarySearch,也許不是用Java?

+0

無論如何這是一個壞主意。我早在70年代就研究過這個問題。二進制搜索是什麼被描述爲虛擬陣列非常緩慢。一個合適的索引結構執行很多次。向混音添加壓縮只會使其變得更糟。 – EJP

回答

0

您需要讀取文件以獲取每個塊的起始位置的索引。一旦你有這個,你可以做這些塊的二進制搜索。注意:如果您有底層記錄或密鑰,則可能會將其分成多個塊。

更好的解決方案是自己構建壓縮文件。將已知數量的記錄寫入一個塊並單獨壓縮這些記錄。另外,您可以編寫一個索引來說明每個塊的起始位置以及該塊的第一個鍵。這將允許您在不解壓縮所有密鑰的情況下找到正確的塊,並且只解壓縮一個塊而不是每個搜索的log2(n)塊。

+0

嘿,我忘記了這個鑰匙可能在兩個街區的邊緣。看起來像未壓縮文件或自定義壓縮是唯一的選擇。謝謝彼得。 – dkiselev

+0

@ user1904112您可以一次解壓兩個塊,問題是如果您讀取文件中的一個隨機點,您是否可以掃描,直至找到可靠的密鑰? –

+0

是的,我可以。但是,據我瞭解,由於可變的壓縮塊長度,我應該依次掃描塊。 (因爲我發現gzip/bzip默認不添加塊索引)並且定製打包仍然是最佳選擇。 – dkiselev