问题标签 [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.

0 投票
1 回答
330 浏览

java - Java-mappedbytebuffer是否占用直接内存?

我很好奇mappedbytebuffer是否占用Java中的直接内存?正如这里提到的

也可以通过将文件的区域直接映射到内存来创建直接字节缓冲区

当我将文件映射到内存时,应该使用直接内存。但是我用 JVM 参数“-XX:MaxDirectMemorySize=200MB”启动了一个程序,然后我尝试将一个 1GB 的文件映射到内存中,它起作用了。更重要的是,我先分配了一个200MB的directByteBuffer,然后尝试将1GB的文件映射到内存中,它仍然有效!那么,mappedbytebuffer 占用了哪一部分内存呢?

0 投票
2 回答
8374 浏览

java - 多线程读取大文件

我正在实现一个应该接收大文本文件的类。我想将它分成块,每个块由一个不同的线程保存,该线程将计算这个块中每个字符的频率。我希望启动更多线程以获得更好的性能,但事实证明性能越来越差。这是我的代码:

0 投票
1 回答
227 浏览

java - MappedByteBuffer - BufferOverflowException

我正在使用 MappedByteBuffer 将记录写入文件。下面是我的代码。当我增加要写入的 numberOfRows 时,它会抛出 BufferOverflowException。它适用于 1000 万个 numberOfRows。如果我将 numberOfRows 增加到 1 亿,它会抛出 BufferOverlowException!?

关于问题的任何提示?

编辑1:异常问题已解决并回答如下。

编辑2:关于性能的最佳选择。

@EJP:这是在 BufferedOutputStream 周围使用 DataOutputStream 的代码。

.......... 谢谢

0 投票
1 回答
199 浏览

java - 使用 MappedByteBuffer 时出现 IndexOutOfBoundsException

我正在考虑使用 MappedByteBuffer 将一些数据存储/加载到文件中。假设我有一个 long 类型的字段 A 和一个字符串的字段 B 在序列化时如下所示:B(字符串)

现在我想写和读它。这是一段示例代码:

所以以后我可以通过调用mbb.getLong(0)
mbb.get(outputArray,8,outputArray.length)

但现在我在地方(2)失败了。有什么建议么?

0 投票
3 回答
1167 浏览

java - Java,为什么从 MappedByteBuffer 读取比从 BufferedReader 读取慢

我试图从一个可能很大的文件中读取行。

为了获得更好的性能,我尝试使用映射文件。但是当我比较性能时,我发现映射文件方式甚至比我读取的速度慢一点BufferedReader

在 Linux 中读取大小为 537MB 的文件的测试结果:

MappedBuffer方式:

BufferedReader 方式:

0 投票
0 回答
51 浏览

java - 1.7 JVM(32 位)和 windows 32 位操作系统错误。地图失败

我的程序在 windows 64bit、linux 64bit 中运行良好。

但是当我将程序移植到带有 32 位 JDK(版本:1.7.0_80)的 Windows 32 位 2008 SP2(RAM 16GB)时出现问题。

  1. 我试过以下

    • java -xmx1024m TestAppServer : 失败并出现错误java.io.IOException: Map failed
    • java -xmx512m TestAppServer:运行成功
  2. 我发现了以下类似的问题

我想知道为什么在分配更多堆内存(1024m)时会出现这个问题以及如何解决?

0 投票
2 回答
2084 浏览

java - 有没有办法在 Java 中映射大于 Integer.MAX_VALUE 的文件?

FileChannel#map,用于映射文件(即启动内存映射),采用一个long作为长度参数。

然而,关于文档FileChannel#map的内容如下:

size - 要映射的区域的大小;必须为非负数且不大于 Integer.MAX_VALUE

首先,如果他们只允许高达 的值,为什么他们首先使用 long Integer.MAX_VALUE?是否有可能一次映射比这更大的文件?

例如,如果我想映射一个 10GB 的文件,我想写这样的东西(InvalidArgumentException由于长度太大而最终导致):

我是否必须为此创建连续的内存映射,例如,5 个内存映射,每个映射 2GB 给定文件?

0 投票
0 回答
394 浏览

java - 使用 MappedByteBuffer 时未释放内存

我正在尝试读取一个大文件 chunk 。所以读操作将被多次调用,被偏移参数之一。读取工作正常。

但真正的问题是当我在读取完成后尝试删除文件时开始。它正在抛出 IO 异常。

我不想强制垃圾收集(System.gc()) 。

阅读代码:

0 投票
0 回答
563 浏览

java - 从 Java 中的匿名/非持久内存映射文件中读取

Java通过检索的 via支持内存映射文件。这些文件允许多个进程共享内存,以及其他用途。MappedByteBufferFileChannel#map

Wikipedia 文章中所述,有两种类型的内存映射文件:

坚持

持久文件与磁盘上的源文件相关联。最后一个过程完成后,数据将保存到磁盘上的源文件中。这些内存映射文件适用于处理非常大的源文件。

非持久化

非持久文件不与磁盘上的文件相关联。当最后一个进程完成对文件的处理时,数据将丢失。这些文件适用于为进程间通信 (IPC) 创建共享内存。

持久化内存映射文件很容易通过FileChannel#map. 但是,无法以这种方式获取非持久(匿名)文件。例如,在 Python 中,使用mmap,可以-1作为文件编号和唯一标记名称(在 Windows 中)传递,以获取匿名内存映射文件的段。

  1. 是否可以从 Java 中的匿名/非持久内存映射文件中读取?

  2. 如果是这样,是否可以(在 Windows 中)指定标记名称来映射匿名文件数据?

0 投票
0 回答
374 浏览

java - 内存映射文件如何在多进程场景中工作?

这个问题困扰了我好几天:

假设我有两个进程(p_writep_read)在同一台机器上运行。

  • 过程p_write用于写入/更新 mmap 文件。

  • 进程p_read用于消费 mmap 文件,或者换句话说,从 mmap 文件中读取。

我在这里的假设是p_write首先需要为 mmap 文件分配一个内存空间(堆外)(该空间使用 Java MappedByteBufferAPI 自动映射到文件)。

我的问题是p_read 如何从 mmap 文件中读取?我现在的假设是,p_read还需要为要映射到的 mmap 文件分配另一个相同大小的堆外空间,但这似乎不正确,因为在这种情况下内存量需要加倍。

如果p_read不需要为要映射到的mmap文件分配单独的内存空间,如何p_read知道文件映射到的正确内存地址p_write

更新 1

我找到了一个更好的问题要问,或者你可以将其视为一个后续问题:如果FileChannel.map()被调用两次,同一个文件是否会被映射两次到两个不同的内存空间?

如果这两种情况都映射到同一个内存空间,也许这两种情况并不重要?