【问题标题】:Can we use Object Pooling concept instead of declaring large size byte array?我们可以使用对象池概念而不是声明大字节数组吗?
【发布时间】:2012-01-20 10:29:27
【问题描述】:

我有一个问题,我们可以使用对象池概念而不是将大尺寸字节数组声明为 20MB。如果是,那么如何?实际上,我有一个声明为byte[] fileData = new byte[2097152];,因为在我们尝试连续访问同一个 java 文件 20 到 24 次后,我必须从应用程序中经常返回 OutOfMemory Exception 的视频文件中读取这么多数据。意味着这不是错误,在这种情况下堆内存已满,GC 无法在给定的时间跨度内清除相同的内存,这就是它返回 OutOfMemory 异常的原因。那么,我们可以在这里使用 ObjectPooling 的 JAVA 概念来提高内存利用率吗?

提前致谢。

【问题讨论】:

  • 通常以块的形式处理此类文件,是的。如果您不按顺序处理文件,则可能不得不求助于池加载程序。您正在寻找使用多线程的模式?

标签: android object-pooling


【解决方案1】:

您正在尝试解决错误的问题...您应该专注于不要将整个 2MB 文件加载到 RAM 中,因为您确实不需要这样做。

在 RAM 中创建一个小窗口,例如 64KB,然后逐段加载文件。这就是视频播放器等的作用。

(也就是说,2MB 并不是那么。如果它更容易,请确保只分配一次,然后重复使用该分配。)

【讨论】:

  • 嗨 Reuben,我是 Android 开发新手。你能告诉我如何在 RAM 中创建一个每个 64 KB 的窗口并逐个加载数据。
  • 字节[] buff=新字节[65536];文件文件 = 新文件(“my_video_file.mp4”); InputStream is = new FileInputStream(file); int bytes_to_read = file.length(); while (bytes_to_read>0) { int num_bytes_read = is.read(buffer, 0, Math.min(buffer.size(), bytes_to_read));如果 (num_bytes_read
  • 反正就是这样。我是凭记忆做到的,没有包括任何异常处理。不过应该足以让您入门。
  • 感谢您的帮助 Reuben,但我认为存在一些问题,因为我的目标与您理解的不同。实际上,我必须从视频文件中读取那么多数据,并且在更改每个 64KB 数据之后,我必须将整个数据再次写入同一个视频文件中。那么这个机制能在同样的概念上帮助我吗?
  • 为什么? 究竟你想做什么?
猜你喜欢
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多