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

时间:2013-01-21 19:13:47

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

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

首先,以下代码可行,我的主要问题是减少内存使用量并提高性能。

以下代码段只是大局的一小部分,但在进行一些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"));
....

由于String很大(我需要它也是如此大的块),因此可以分配大量的内存。我的主要问题是由于getBytes,同样的分配会发生两次,

  1. 所以我的问题是他们可以将 findWithinHorizo​​n 结果直接转移到 InputStream 而无需分配内存两次?

  2. 他们是否能更有效地实现相同的功能?

1 个答案:

答案 0 :(得分:0)

不是完全相同的方法,而是findWithinHorizon,您可以尝试读取每一行并在行上下文中搜索模式。这肯定会降低内存压力,因为你没有像API那样缓冲整个文件:

  

如果horizo​​n为0,则忽略地平线并继续此方法   搜索输入,查找指定的模式而不用   界。 在这种情况下,它可以缓冲所有搜索的输入   图案

类似的东西:

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

   }
}