【发布时间】:2013-01-04 22:02:43
【问题描述】:
我写了一个应用程序,它在它的一个模块中解析大文件并将这个文件逐块保存到数据库中。
首先,以下代码可以工作,我的主要问题是减少内存使用并总体提高性能。
以下代码sn-p是大图的一小部分,但是在做了一些YourKit profiling之后问题最大, /*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"));
....
分配大量内存是可以接受的,因为字符串很大(我也需要这么大的块),我的主要问题是 getBytes 导致相同的分配发生两次,
所以我的问题是他们有一种方法可以将 findWithinHorizon 结果直接传输到 InputStream 而无需两次分配内存?
他们是否有更有效的方式来实现相同的功能?
【问题讨论】:
标签: java memory-management inputstream java.util.scanner