Java 使用HashMap存储文件位置,并使用RandomAccessFile随机访问这些位置

Java 使用HashMap存储文件位置,并使用RandomAccessFile随机访问这些位置,java,csv,hashmap,on-disk,Java,Csv,Hashmap,On Disk,初始问题: 我有以下问题:我正在使用Java加入2个CSV。虽然我可以“流”其中一个CSV(逐行读取、处理、写出),但较小的CSV驻留在内存中(精确地说是aHashMap),因为我需要在遍历大CSV时查找每一行的键。问题是:如果“小CSV”太大而无法保存在mem中,我就会遇到OutOfMem错误 虽然我知道我可以通过将两个CSV读入数据库并在那里执行连接来避免这些问题,但在我的应用程序中这样做是不可行的。是否有Java包装器(或其他类型的对象)允许我只在内存中保留HashMap的键,并将其所有值

初始问题:

我有以下问题:我正在使用Java加入2个CSV。虽然我可以“流”其中一个CSV(逐行读取、处理、写出),但较小的CSV驻留在内存中(精确地说是a
HashMap
),因为我需要在遍历大CSV时查找每一行的键。问题是:如果“小CSV”太大而无法保存在mem中,我就会遇到OutOfMem错误

虽然我知道我可以通过将两个CSV读入数据库并在那里执行连接来避免这些问题,但在我的应用程序中这样做是不可行的。是否有Java包装器(或其他类型的对象)允许我只在内存中保留
HashMap
的键,并将其所有值放入磁盘上的临时文件(以自我管理的方式)


更新:

在ThomasKläger和JacobG的评论之后,我用以下方式解决了这个问题:

使用
HashMap
存储行的键以及使用
RandomAccessFile
.getFilePointer()
存储该行的开始和结束位置

在浏览大型CSV时,我现在使用
HashMap
查找匹配行的位置,
.seek(pos)
,并读取它们


这是一个有效的解决方案,非常感谢。

根据您的描述,您需要一些类似堆外集合的内容,例如MapDb lib,来自描述:

MapDB提供Java映射、集合、列表、队列和其他由堆外或磁盘存储支持的集合。它是java收集框架和嵌入式数据库引擎的混合体


你考虑过SQLite吗?@Makoto:我正在积极考虑H2DB,但如果可能的话,我想避免。但这可能是唯一可行的途径。你可以
ehcache
。他们的
Cache
提供了
Map
也提供的许多方法,并且可以配置为将条目卸载到磁盘存储上。您的小文件有多大?在一台拥有16GB内存的现代64位机器上,我希望您可以处理一个最大为2GB的“较小”文件(以及一个不受限制的较大文件),而无需使用problem@ThomasKl阿德格尔:我目前正在研究ehcache,它看起来很有希望。小型CSV为9GB,这就是问题的根源所在。。。