我有一个大小为5GB的文件。我希望在Java中进行内存映射。我知道一个内存映射部分的大小不能超过2GB。
我的问题是,是否可以创建5个1GB的内存映射部分来映射完整的5GB文件,并在同一Java应用程序中访问它们。
我有一个大小为5GB的文件。我希望在Java中进行内存映射。我知道一个内存映射部分的大小不能超过2GB。
我的问题是,是否可以创建5个1GB的内存映射部分来映射完整的5GB文件,并在同一Java应用程序中访问它们。
long
作为offset和size,但它返回的MappedByteBuffer
仅能使用int
作为其limit和position。这意味着,即使在64位机器和操作系统上,您可以将整个5 GB文件视为单个区域映射,在Java中,您仍需要手动创建一系列映射区域,每个区域不能大于2 GB。尽管如此,您仍至少可以按块映射5 GB,而在32位操作系统上,您无法同时拥有它们的映射。考虑到在Java中取消映射文件区域需要一些丑陋的技巧,为了保持它们在限制范围内,映射和取消映射区域是不方便的(尽管可能)。您可以查看Lucene或Cassandra的源代码。据我所知,他们还会在可能的情况下使用带有本机代码的库,以比纯Java更有效地处理映射和取消映射。MappedByteBuffer
和FileChannel.map()
的Java文档。MappedByteBuffer
。请随意编写一个简单的类来测试和操作您的大文件。