Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从findWithinHorizon返回的Java大字符串已转换为InputStream_Java_Memory Management_Inputstream_Java.util.scanner - Fatal编程技术网

从findWithinHorizon返回的Java大字符串已转换为InputStream

从findWithinHorizon返回的Java大字符串已转换为InputStream,java,memory-management,inputstream,java.util.scanner,Java,Memory Management,Inputstream,Java.util.scanner,我编写了一个应用程序,它在其中一个模块中解析巨大的文件,并将该文件逐块保存到数据库中 首先,下面的代码是有效的,我的主要问题是减少内存使用并提高性能 下面的代码片段只是大局的一小部分,但在进行了一些YourKit评测之后问题最大,这里用/*标记的行*/分配了大量内存 .... Scanner fileScanner = new Scanner(file,"UTF-8"); String scannedFarm; try{ Pattern p = Pattern.compile("(?:

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

首先,下面的代码是有效的,我的主要问题是减少内存使用并提高性能

下面的代码片段只是大局的一小部分,但在进行了一些YourKit评测之后问题最大,这里用/*标记的行*/分配了大量内存

....
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"));
....
分配大量内存是可以接受的,因为字符串太大了,我也需要这么大的块,我的主要问题是相同的分配会发生两次,结果是getBytes

所以我的问题是,他们有没有一种方法可以将findWithinHorizon结果直接传输到InputStream,而无需分配两次内存

它们是否更有效地实现相同的功能


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

如果“地平线”为0,则忽略地平线并继续此方法 在输入中搜索指定的模式,而不使用 跳跃在这种情况下,它可能会缓冲所有的输入搜索 模式

比如:

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

   }
}

缓冲输入而不进行绑定和回退是目的,逐行处理要慢得多,而且不必要,因为所有的行都需要作为单个块发送到数据库,并且不需要在行之间进行处理,该输入流作为一个块发送到LOAD DATA语句中,较小的块将导致加载数据无效,正如我提到的,较大的块是有意的。我真的不明白这是怎么回事。你有描述过逐行的方法吗?当您缓冲整个文件时,堆会有多大?堆消耗量大约为1GB,行处理的时间性能不可接受。