我必须在text [csv]文件中写入大量数据.我使用BufferedWriter来写入数据,大约需要40秒来写入174 MB的数据.这是java提供的最快速度吗?
bufferedWriter = new BufferedWriter ( new FileWriter ( "fileName.csv" ) );
Run Code Online (Sandbox Code Playgroud)
注意:这40秒包括迭代和从结果集中提取记录的时间.:).174 MB是结果集中的400000行.
我有一个巨大的文件,由~800M行(60g)组成.行可以是重复的,由id和值组成.例如:
id1 valueA
id1 valueB
id2 valueA
id3 valueC
id3 valueA
id3 valueC
Run Code Online (Sandbox Code Playgroud)
注意:ids不按示例中的顺序(和分组).
我希望按键聚合行,这样:
id1 valueA,valueB
id2 valueA
id3 valueC,valueA
Run Code Online (Sandbox Code Playgroud)
有5000个可能的值.
该文件不适合内存,因此我无法使用简单的Java集合.此外,行的最大部分是单个(例如id2),它们应该直接写在输出文件中.
出于这个原因,我的第一个解决方案是迭代两次文件:
问题是我无法完成第一次迭代导致内存限制.
我知道可以通过多种方式解决问题(键值存储,映射缩减,外部排序).
我的问题是什么方法可以更适应使用和快速实施?它只是一次进程,我更喜欢使用Java方法(而不是外部排序).
假设我正在使用 Spring 设计一个 REST 服务,并且我需要一个接受文件并返回某种 ResponseDto 的方法。应用程序服务器的 POST 请求大小限制为 100MB。这是假设的弹簧控制器方法实现:
public ResponseEntity<ResponseDto> uploadFile(@RequestBody MultipartFile file) {
return ResponseEntity.ok(someService.process(file));
}
Run Code Online (Sandbox Code Playgroud)
假设我的服务器有 64GB RAM。如果在短时间内(足够短,足以让process()方法仍然对上传的每个文件运行),1000 个用户决定上传 100MB 文件(或者只有 1 个用户同时上传),如何确保不会出现内存不足错误1000 个文件)?
编辑:为了澄清,我想确保我的应用程序不会崩溃,而只是停止接受/延迟新请求。
好吧,所以我们有这个问题,我知道我可以使用InputStream来读取流而不是读取整个文件,因为这会导致内存问题.
参考这个答案:https://stackoverflow.com/a/14037510/1316967
然而,关注的是速度,在这种情况下,我会读取整个文件的每一行.考虑到这个文件包含数百万个无序的名称,这个操作必须在几秒钟内完成,我该如何解决这个问题.