2012-02-08 97 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

相关问题