问题标签 [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 回答
181 浏览

java - MappedByteBuffer 到位图?

我有一个 MappedByteBuffer,其中一部分包含 PNG 文件的字节。

我想调用:BitmapFactory.decodeByteArray(byte[] data, int offset, int length);

我是否必须将 MappedByteBuffer 的部分移动到 byte[] 中,或者有什么方法可以传递 MappedByteBuffer?

谢谢!

0 投票
1 回答
781 浏览

java - 64 位 Windows 上的 32 位 JVM 最大内存大小没有预期的那么大

我一直在艰难地映射一个 550MB 的文件。我了解 32 位 JVM 最多可以分配 1.4G 左右的内存大小,所以我需要分部分映射一个大文件。但是,这是一个 550MB 的文件,但我仍然无法将其全部映射到内存中。我能做的最好的事情是缓冲区大小约为 333MB。

下面是我的测试代码:

错误如下:

Exception in thread "main" java.io.IOException: Map failed at sun.nio.ch.FileChannelImpl.map(Unknown Source) at TestSpliter.testMap(TestSpliter.java:22) at TestSpliter.main(TestSpliter.java:14) Caused by: java.lang.OutOfMemoryError: Map failed ...

JVM参数:-Xms1024m

谁能解释为什么我只能使用 1.4GB 中的 300MB?谢谢。

请注意,这不是与那些询问 32 位 JVM 的最大堆大小的问题重复的问题。

0 投票
1 回答
206 浏览

java - 逐块(字节)比较文件java

我尝试逐块比较两个文件。如果块相等 - 获取下一个块并比较它们。如果最终块相等 - 返回 true;所有其他变体 - 返回 false。我不明白如何正确处理下一个块以及如何获得文件结尾。

0 投票
1 回答
549 浏览

java - 在文件作为 RandomAccessFile 打开并映射为 MappedByteBuffer 后重命名文件

我正在尝试重命名之前用作 RandomAccessFile 的文件。

当我尝试重命名文件时,我在 renameTo 调用时收到错误消息。当我使用 Windows 应用程序进程监视器时,我看到没有重命名调用。

我怎么可能无法重命名作为 RandomAccessFile 打开的文件?

以下代码将复制我遇到的问题:

0 投票
2 回答
4529 浏览

java - 内存不足错误:Java 堆空间

我正在尝试使用映射字节缓冲区读取文件,并在buffer.position(position);行获得OutOfMemoryError:JavaHeapSpace ; ..我不明白代码有什么问题..错误的原因可能是什么?

0 投票
2 回答
2058 浏览

java - java内存映射文件多线程读/写

我有 2 个线程同时访问同一个大文件(.txt)。

第一个线程正在从文件中读取。第二个线程正在写入文件。

两个线程都访问同一个块,例如(start:0,blocksize:10),但具有不同的通道和缓冲区实例

读者:

作家:

我知道如果两者同时开始,我会得到重叠异常!但是我想知道的是,重叠到底发生在什么时候?我的意思是什么时候发生“锁定”?示例:假设作者首先获得访问权限,然后如果读者尝试访问,那么在什么时候有可能?:

1、2、3 还是 4?

没有4是肯定的,因为通道被关闭了!其他点呢?

谢谢!

0 投票
0 回答
421 浏览

java - 具有多个文件的 MappedByteBuffer

谈到Java NIO MappedByteBuffer,是否可以将不同文件的一部分映射到缓冲区中?像这样的东西:

然后是这样的:

目前,发生的情况是在第一个“放置”中,缓冲区的限制已经设置为某个值。第二次“放入”缓冲区会导致缓冲区溢出异常。我已经为缓冲区分配了足够的空间。

我将如何使用第二个文件中的值更新(即附加)这个缓冲区?

编辑:我最初的问题是不正确的。编辑它,使其更有意义。

我有一些大文件(比如 4 个,现在大小相等),这些文件,即使是单独的,也不适合内存。我必须对 4 个文件执行操作并创建一个输出文件。由于与文件的大小相比,我的内存非常小,我一次只能处理 4 个块,即一次从每个文件中处理一个块。我可以创建多个 MemoryByteBuffers 映射到文件中的特定块,然后写入 ByteBuffer 进行处理,或者我可以直接将每个块写入 ByteBuffer。

在这种情况下使用 MemoryByteBuffer 有什么优势/意义吗?

0 投票
0 回答
1166 浏览

java - 用 Java 编写和读取 MappedByteBuffer

我正在学习 java 中的内存映射文件。我想知道如何写入/读取 MappedByteBuffer。

这是我用于写入 MappedByteBuffer 的代码。

尝试执行此操作时出现 BufferOverflow 异常。

在写入时达到限制后如何增加 MappedByteBuffer 的大小,如果我不知道我将提前写入文件的内容的大小?

为了阅读,让我们以这种情况为例,我创建一个具有初始缓冲区大小的 MappedByteBuffer,如果达到该初始大小的末尾,我如何映射文件的不同部分

更一般地说,我有一个文件,从文件的一部分到另一部分的字节偏移量,当我在点 (x) 读取偏移量 (y) 时,我想从 (x) 跳转到 (y)。我该怎么做?

提前感谢您帮助我。

0 投票
1 回答
424 浏览

java - 为什么这个“行数”程序在 Java 中很慢?使用 MappedByteBuffer

为了尝试MappedByteBuffer(Java 中的内存映射文件),我编写了一个简单的wc -l(文本文件行数)演示:

我在一个大约 15 MB(15008641 字节)和 100k 行的文件上尝试了这个。在我的笔记本电脑上,大约需要13.8 sec. 为什么这么慢?

完整的课程代码在这里: http: //pastebin.com/t8PLRGMa

作为参考,我在 C 中写了同样的想法:http: //pastebin.com/hXnDvZm6

它运行大约 28 毫秒,或490 times faster.

出于好奇,我还使用与 Java 中基本相同的算法和 API 编写了一个 Scala 版本。它运行10 times faster,这表明肯定发生了一些奇怪的事情。

更新:该文件由操作系统缓存,因此不涉及磁盘加载时间。

我想使用内存映射来随机访问可能不适合 RAM 的更大文件。这就是为什么我不只是使用 BufferedReader。

0 投票
1 回答
141 浏览

java - 当您不断更改地图大小时,Java MappedByteBuffer 性能越来越差

最近我做了一些关于 Java MappedByteBuffer 的测试。我发现,如果我不断地映射同一个文件并阅读它,阅读所花费的时间会越来越长。但是如果我不改变地图大小,它会比我在地图大小变化测试中使用相同的地图大小更快。

我有一个 1GB 的文件“dataFile”,里面充满了整数。

还有一种阅读方法

变化 buffSize 测试

变化输出:

固定的 buffSize 测试:

输出

正如 2 次测试所示,使用相同 buffSize(1024MB) 进行读取所花费的时间在 2 次测试中完全不同。固定 buffSize 的测试比变化测试快得多。

我的问题是:1.这是怎么发生的,为什么会更快?2、MappedByteBuffer是否占用物理内存?正如我在 ActivityMonitor 中看到的,它不会占用物理内存。

谢谢

- - - 更新 - - -

释放缓冲区代码:

我不认为这个问题的原因是内存使用。因为即使我打开发布代码和gc代码它也有相同的输出。无论如何,如果是关于内存使用情况,我在第二次测试中将循环次数设置为 100,它应该比第一次测试使用更多的内存,但它比第一次更快。

----- 更新 2 -----

如果我在测试 1 中将 buffSize 减少而不是增加,问题就会消失。

输出: