从 findWithinHorizo​​n 返回的 Java 大字符串转换为 InputStream

标签 java memory-management inputstream java.util.scanner

我编写了一个应用程序,该应用程序在其一个模块中解析大文件并将该文件逐 block 保存到数据库中。

首先,以下代码有效,我的主要问题是减少内存使用和总体性能提高。

以下代码片段是大图片的一小部分,但在进行一些 YourKit 分析后是最有问题的,由 /*Here*/ 标记的行分配了大量内存.

....
Scanner fileScanner = new Scanner(file,"UTF-8");
String scannedFarm;
try{

    Pattern p = Pattern.compile("(?:^.++$(?:\\r?+\\n)?+){2,100000}+",Pattern.MULTILINE);
    String [] tableName = null;

/*HERE*/while((scannedFarm = fileScanner.findWithinHorizon(p, 0)) != null){
         boolean continuePrevStream = false;
         Scanner scanner = new Scanner(scannedFarm);

         String[] tmpTableName  = scanner.nextLine().split(getSeparator());
         if (tmpTableName.length==2){
             tableName = tmpTableName;
         }else{
             if (tableName==null){
                 continue;
             }
             continuePrevStream = true;
         }
         scanner.close();

/*HERE*/ InputStream is = new ByteArrayInputStream(scannedFarm.getBytes("UTF-8"));
....

分配大量内存是可以接受的,因为字符串很大(我也需要这么大的 block ),我的主要问题是相同的分配由于 getBytes 发生两次,

  1. 所以我的问题是他们有办法将 findWithinHorizo​​n 结果直接传输到 InputStream 而不分配两次内存吗?

  2. 他们是实现相同功能的更有效方法吗?

最佳答案

不完全相同的方法,但您可以尝试读取每一行并在行上下文中搜索模式,而不是findWithinHorizo​​n。这肯定会减少内存压力,因为您不会按照 API 的规定缓冲整个文件:

If horizon is 0, then the horizon is ignored and this method continues to search through the input looking for the specified pattern without bound. In this case it may buffer all of the input searching for the pattern.

类似于:

while(String line = fileScanner.nextLine() != null) { 
   if(grep for pattern in line) { 

   }
}

关于从 findWithinHorizo​​n 返回的 Java 大字符串转换为 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14445599/

相关文章:

java - 为什么我们在 .class 文件的开头需要一个魔数(Magic Number)?

java - Scanner 为什么要实现 Iterator<String>?

c - 共享库页面是匿名的吗?

iPhone内存管理(基础)

c - 如何写一个简单的 "page fault generator"?

java - 使用扫描仪读取下一行的顺序出现问题

java - AttachCurrentThread 崩溃

java - 从泛型类型获取枚举类?

java - InputStream.read(byte[]) 返回的 0 是什么意思?如何处理?

java - 记录输入流