gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:54:09 25 4
gpt4 key购买 nike

我编写了一个应用程序,该应用程序在其一个模块中解析大文件并将该文件逐 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com