2012-02-08 94 views
1

可能重複:
exception while Read very large file > 300 MBjava:如何在一個大文件中搜索字符串?

現在,我想從一個大文件(> = 300M)搜索的字符串。由於文件很大,所以我無法將其加載到內存中。

可以提供什麼樣的方式來解決這個問題?

感謝

+2

參見http://stackoverflow.com/questions/3584540/read-and- process-big-text-file-in-java – DNA 2012-02-08 15:04:37

+0

http://docs.oracle.com/javase/6/docs/api/java/nio/channels/FileChannel.html#map%28java.nio.channels.FileChannel。 MapMode,%20long,%20long%29 – Bozho 2012-02-08 15:05:09

回答

1

有幾個選項:

  1. 根據您的目標操作系統,你也許可以把這個任務移交給一個系統實用程序,如grep(這是已經爲這個優化類型的工作),並簡單地解析輸出。
  2. 即使文件的大小足以包含在內存中,您也必須從磁盤讀取該文件。因此,您可以簡單地一次讀入一行,並在讀取內容時比較字符串和內容。如果您的應用程序只需要在目標文件中找到第一個字符串,那麼這具有如下優點:如果目標字符串出現在文件的早期,則無需讀取整個文件即可找到所需內容文件的前半部分。
  3. 除非您的應用程序的內存使用量有上限(即必須絕對適用於128 MB內存等),那麼您還可以增加啓動應用程序時JVM將佔用的內存量。但是,由於這種效率低下(就時間和磁盤I/O而言,如#2所指出的那樣),無論文件大小如何,這都不太可能是您想要採用的過程。
1

我會記憶映射文件。不管文件大小(高達2 GB),這不會佔用太多堆(< 1 KB),並且在大多數系統上需要大約10 ms。

FileChannel ch = new FileInputStream(fileName).getChannel(); 
MappedByteBuffer mbb = ch.map(ch.MapMode.READ_ONLY, 0L, ch.size()); 

這工作只要你有至少4 KB的自由(和你的文件小於2 GB長)

+0

聽起來不錯! – zgcharley 2012-02-10 08:05:37

+0

好的是它留給操作系統來確定主內存中有多少(在後臺)你可以編寫代碼,就好像一切都可以立即使用,而不必擔心你有多少空閒內存或哪些頁面更長的需要。 – 2012-02-10 08:07:23

相關問題