在Java中读取3GB的非常大的csv文件的内存有效方法是什么?

时间:2018-03-06 10:16:52

标签: java file lambda

我写了两种方法来读取文件

@Component({
  selector: 'app-map-display',
  templateUrl: './map-display.component.html',
  styleUrls: ['./map-display.component.scss']
})
export class MapDisplayComponent {
    @Output() sendMessage: EventEmitter<any> = new EventEmitter<any>();
}

从第一种方法来看,我理解的是该方法不会立即将文件中的所有行加载到内存中,这样可以提高内存效率。我希望使用lambda表达式实现相同的功能。我的问题是我的第二种方法是否将所有行加载到内存中?如果是,那么如何才能使我的第二种方法内存有效?

2 个答案:

答案 0 :(得分:1)

您的问题的答案位于Files.lines javadoc

  

从文件中读取所有行作为流。与readAllLines不同,此方法不会将所有行读入List,而是在使用流时延迟填充。

您的第二个代码示例应该与第一个代码示例大致相同,具有内存效率。

答案 1 :(得分:0)

使用流api应该导致与其他方法大致相同的内存使用量,除非您并行化流。

来自Javadoc

  

从文件中读取所有行作为流。与readAllLines不同,此方法不会将所有行读入List,而是在流消耗时延迟填充。

     

使用指定的字符集将文件中的字节解码为字符,并支持readAllLines指定的相同行终止符。

     

此方法返回后,从读取文件或读取格式错误或不可映射的字节序列时发生的任何后续I / O异常都包含在将导致读取的Stream方法抛出的UncheckedIOException中发生。如果在关闭文件时抛出IOException,它也会被包装为UncheckedIOException。

     

返回的流封装了一个Reader。如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保在流操作完成后调用流的close方法。