问题标签 [mappedbytebuffer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java-mappedbytebuffer是否占用直接内存?
我很好奇mappedbytebuffer是否占用Java中的直接内存?正如这里提到的
也可以通过将文件的区域直接映射到内存来创建直接字节缓冲区
当我将文件映射到内存时,应该使用直接内存。但是我用 JVM 参数“-XX:MaxDirectMemorySize=200MB”启动了一个程序,然后我尝试将一个 1GB 的文件映射到内存中,它起作用了。更重要的是,我先分配了一个200MB的directByteBuffer,然后尝试将1GB的文件映射到内存中,它仍然有效!那么,mappedbytebuffer 占用了哪一部分内存呢?
java - 多线程读取大文件
我正在实现一个应该接收大文本文件的类。我想将它分成块,每个块由一个不同的线程保存,该线程将计算这个块中每个字符的频率。我希望启动更多线程以获得更好的性能,但事实证明性能越来越差。这是我的代码:
java - MappedByteBuffer - BufferOverflowException
我正在使用 MappedByteBuffer 将记录写入文件。下面是我的代码。当我增加要写入的 numberOfRows 时,它会抛出 BufferOverflowException。它适用于 1000 万个 numberOfRows。如果我将 numberOfRows 增加到 1 亿,它会抛出 BufferOverlowException!?
关于问题的任何提示?
编辑1:异常问题已解决并回答如下。
编辑2:关于性能的最佳选择。
@EJP:这是在 BufferedOutputStream 周围使用 DataOutputStream 的代码。
.......... 谢谢
java - 使用 MappedByteBuffer 时出现 IndexOutOfBoundsException
我正在考虑使用 MappedByteBuffer 将一些数据存储/加载到文件中。假设我有一个 long 类型的字段 A 和一个字符串的字段 B 在序列化时如下所示:B(字符串)
现在我想写和读它。这是一段示例代码:
所以以后我可以通过调用mbb.getLong(0)
和mbb.get(outputArray,8,outputArray.length)
但现在我在地方(2)失败了。有什么建议么?
java - Java,为什么从 MappedByteBuffer 读取比从 BufferedReader 读取慢
我试图从一个可能很大的文件中读取行。
为了获得更好的性能,我尝试使用映射文件。但是当我比较性能时,我发现映射文件方式甚至比我读取的速度慢一点BufferedReader
在 Linux 中读取大小为 537MB 的文件的测试结果:
MappedBuffer方式:
BufferedReader 方式:
java - 1.7 JVM(32 位)和 windows 32 位操作系统错误。地图失败
我的程序在 windows 64bit、linux 64bit 中运行良好。
但是当我将程序移植到带有 32 位 JDK(版本:1.7.0_80)的 Windows 32 位 2008 SP2(RAM 16GB)时出现问题。
我试过以下
- java -xmx1024m TestAppServer : 失败并出现错误java.io.IOException: Map failed
- java -xmx512m TestAppServer:运行成功
我发现了以下类似的问题
我想知道为什么在分配更多堆内存(1024m)时会出现这个问题以及如何解决?
java - 有没有办法在 Java 中映射大于 Integer.MAX_VALUE 的文件?
FileChannel#map
,用于映射文件(即启动内存映射),采用一个long
作为长度参数。
然而,关于文档FileChannel#map
的内容如下:
size - 要映射的区域的大小;必须为非负数且不大于 Integer.MAX_VALUE
首先,如果他们只允许高达 的值,为什么他们首先使用 long Integer.MAX_VALUE
?是否有可能一次映射比这更大的文件?
例如,如果我想映射一个 10GB 的文件,我想写这样的东西(InvalidArgumentException
由于长度太大而最终导致):
我是否必须为此创建连续的内存映射,例如,5 个内存映射,每个映射 2GB 给定文件?
java - 使用 MappedByteBuffer 时未释放内存
我正在尝试读取一个大文件 chunk 。所以读操作将被多次调用,被偏移参数之一。读取工作正常。
但真正的问题是当我在读取完成后尝试删除文件时开始。它正在抛出 IO 异常。
我不想强制垃圾收集(System.gc()) 。
阅读代码:
java - 从 Java 中的匿名/非持久内存映射文件中读取
Java通过检索的 via支持内存映射文件。这些文件允许多个进程共享内存,以及其他用途。MappedByteBuffer
FileChannel#map
如Wikipedia 文章中所述,有两种类型的内存映射文件:
坚持
持久文件与磁盘上的源文件相关联。最后一个过程完成后,数据将保存到磁盘上的源文件中。这些内存映射文件适用于处理非常大的源文件。
非持久化
非持久文件不与磁盘上的文件相关联。当最后一个进程完成对文件的处理时,数据将丢失。这些文件适用于为进程间通信 (IPC) 创建共享内存。
持久化内存映射文件很容易通过FileChannel#map
. 但是,无法以这种方式获取非持久(匿名)文件。例如,在 Python 中,使用mmap
,可以-1
作为文件编号和唯一标记名称(在 Windows 中)传递,以获取匿名内存映射文件的段。
是否可以从 Java 中的匿名/非持久内存映射文件中读取?
如果是这样,是否可以(在 Windows 中)指定标记名称来映射匿名文件数据?
java - 内存映射文件如何在多进程场景中工作?
这个问题困扰了我好几天:
假设我有两个进程(p_write
和p_read
)在同一台机器上运行。
过程
p_write
用于写入/更新 mmap 文件。进程
p_read
用于消费 mmap 文件,或者换句话说,从 mmap 文件中读取。
我在这里的假设是p_write
首先需要为 mmap 文件分配一个内存空间(堆外)(该空间使用 Java MappedByteBuffer
API 自动映射到文件)。
我的问题是p_read 如何从 mmap 文件中读取?我现在的假设是,p_read
还需要为要映射到的 mmap 文件分配另一个相同大小的堆外空间,但这似乎不正确,因为在这种情况下内存量需要加倍。
如果p_read
不需要为要映射到的mmap文件分配单独的内存空间,如何p_read
知道文件映射到的正确内存地址p_write
?
更新 1
我找到了一个更好的问题要问,或者你可以将其视为一个后续问题:如果FileChannel.map()
被调用两次,同一个文件是否会被映射两次到两个不同的内存空间?
和
如果这两种情况都映射到同一个内存空间,也许这两种情况并不重要?