当前位置: 首页 > 面试题库 >

Java:高效内存的ByteArrayOutputStream

阎知
2023-03-14
问题内容

我的磁盘中有40MB的文件,我需要使用字节数组将其“映射”到内存中。

最初,我认为将文件写入ByteArrayOutputStream是最好的方法,但我发现在复制操作期间的某个时刻它会占用约160MB的堆空间。

有人知道不使用三倍于RAM的文件大小的更好方法吗?

更新:
感谢您的回答。我注意到我可以减少内存消耗,告诉ByteArrayOutputStream初始大小比原始文件的大小稍大一点(使用与我的代码相同的大小强制重新分配,必须检查原因)。

还有一个高内存点:当我用ByteArrayOutputStream.toByteArray返回byte []时。看一下它的源代码,我可以看到它正在克隆数组:

public synchronized byte toByteArray()[] {
    return Arrays.copyOf(buf, count);
}

我在想我可以扩展ByteArrayOutputStream并重写此方法,以便直接返回原始数组。鉴于流和字节数组不会被多次使用,这里是否存在潜在的危险?


问题答案:

MappedByteBuffer
可能就是您要寻找的。

不过,令我惊讶的是,要花费如此多的RAM来读取内存中的文件。您是否构建了ByteArrayOutputStream具有适当容量的?如果没有,则流可以在40
MB快要用完时分配一个新的字节数组,这意味着,例如,您将拥有39MB的完整缓冲区和两倍大小的新缓冲区。而如果流具有适当的容量,则不会有任何重新分配(更快),也不会浪费内存。



 类似资料:
  • 问题内容: (关于省时的稀疏数组存在一些问题,但我正在寻找内存效率。) 我需要一个相当于或哪些 只需设置一个比以前遇到的密钥大的密钥即可按需增长。(可以假定键为非负数。) 与大多数索引不是(即实际数据不是很稀疏时)的情况下的内存效率差不多。 当索引稀疏时,消耗的空间与非索引的数量成正比。 使用的内存少于(因为这会使键自动装箱并且可能不利用标量键类型)。 可以获取或设置摊销log(N)时间中的元素,

  • 问题内容: 我正在使用box2d在Java中创建一个物理游戏。 我正在编写一个AI类,并希望在考虑内存对齐的情况下确保尽可能高效地存储我的数据。 最小的增加可能会产生巨大的变化,因为我实际上正在“尽可能多地运行AI对象”,直到系统变慢为止。该程序已经在碰撞检测上使用了大量内存,因为我想再次能够支持尽可能多的代理商。 到目前为止,我所了解的是,最小的Java类型是8bytes,并且对象被填充为8的倍

  • 问题内容: 我存储了1.11亿个键值对(一个键可以有多个值-最多2/3),它们的键是50位整数,值是32位(最大)整数。现在,我的要求是: 快速插入(键,值)对[允许重复] 基于键快速检索一个或多个值。 这里基于MultiMap给出了一个很好的解决方案。但是,我想在主内存中存储更多键/值对,而不会降低性能。我从网络文章中研究到B +树,R+树,B树,紧凑多图等可以是一个很好的解决方案。有谁能够帮我

  • 一些背景 我正在解决一个问题,我将集合存储在hashmap中,其中键是集合名,即Set1-- 该程序的目的是从用户那里取一个值作为“阈值”,即2,它用于集合之间的最小共性。如果达到或超过阈值,程序建议集合之间合并。 我已经创建了一个组合生成器,它将生成集合名称之间的所有可能组合,以便与未考虑的顺序进行比较,即(Set1,Set2,),(Set1,Set3),(Set2,Set3),(Set1,Se

  • 我正在用Python实现一个Trie。到目前为止,我遇到了两种不同的方法来实现它: -存储字符 -存储单词结尾(true或false) -存储具有当前前缀的单词数 我们派生出这本词典: 哪一种是高效的、标准的数据结构,既能有效地存储内存,又能快速地进行字的大数据集上的遍历和其他trie操作?

  • 问题内容: 我目前有一个电子表格类型程序,该程序将其数据保存在HashMaps的ArrayList中。当我告诉您这还不理想时,您无疑会感到震惊。开销似乎使用的内存比数据本身多5倍。 这个问题询问有效的馆藏库,答案是使用Google馆藏。 我的跟进是“ 哪一部分? ” 。我一直在阅读文档,但感觉不像是哪种类最适合。(我也向其他图书馆或建议开放)。 因此,我正在寻找可以使我以最小的内存开销存储密集电子