【问题标题】:What's the most reliable data compression algorithm for Android?Android 最可靠的数据压缩算法是什么?
【发布时间】:2020-10-31 15:39:12
【问题描述】:

我需要一种算法来压缩我的统计数据以最小化带宽。它在 Android 应用程序中,所以我需要一种内存成本低、分配次数最少且最可靠的算法。看起来在某些情况下压缩失败 - OOM 或快速进程终止,我不确定。

我说的是每天从数十万台设备发送的千兆字节数据——每台设备发送的数据量很小,但一旦有数百个设备,我就会经常看到一些几乎不可能出现的错误。

最近我使用了 CBZip2InputStream、Deflater 和 GZIPOutputStream,我最终使用了 GZIPOutputStream,因为前两个有时会给出无法解包或失败的数据。但我不确定我的选择是否正确,因为我自己从未在本地测试中看到所有三个都失败 - 仅在我收到的服务器统计数据中。

我不需要非常高的压缩,至少需要一些压缩,但它必须每次都能工作,并且理想情况下可以使用我提供的静态数据缓冲区。也许有一种成本极低的算法?

请指教!

【问题讨论】:

  • 如果您将发送的信息保持在小于 ip 数据包的大小,压缩只会增加开销。您不会节省带宽,只会增加开销。要考虑的一件事是您的网络协议。如果数据量小,可以考虑 UDP。
  • “看起来在某些情况下压缩失败 - OOM 或快速进程终止,我不确定” - 这些不太可能是由于选择了压缩算法。它们更有可能是由于您自己的代码中碰巧使用压缩算法的错误造成的。
  • “这可能是由进程终止引起的”——这是您代码中的一个错误,恰好使用了压缩算法。 “所以我想尽量减少这种可能性”——然后你需要修复代码中碰巧使用压缩算法的错误。更改压缩算法本身不太可能有帮助。
  • @CommonsWare 实际上在我压缩文件之前有几个条件,网络就是其中之一。会看WorkManager,谢谢!
  • @CommonsWare 在高负载 c++ 世界中表现良好我曾经认为“新”是一个坏主意,所以我尽可能使用预分配或静态内存。 Java 世界是纯粹的体系结构和动态的,类之上的类之上的类。并且很多时候,我最终得到了我自己管理的静态 int 数组,以使每一帧都正常工作:) 因此,我认为有一个 Gzip 的 java 实现,它根本不会分配内存并在我提供的缓冲区中工作。

标签: java android compression


【解决方案1】:

数据压缩和解压并不是什么不可靠的。您需要调试您遇到的不可靠的数据传输或处理。

【讨论】:

  • 我可能用了不正确的词,我的意思是简单、快速并且可以使用预先分配的内存缓冲区的算法,因此可以在“激进”且不可靠的环境中工作。想象一下静态数组与动态对象列表相比,后者又大量使用“新”。
  • @Tertium 那么你的问题是问两个完全不同的事情。您的问题之一是寻求帮助以调试通信中的故障。您假设了一些可能的原因,例如“不可靠”的压缩和解压缩或内存不足故障,但您实际上不知道。您问题的第二部分是要求一种使用静态数据缓冲区的方法。然后你需要在 stackoverflow 上问两个不同的问题。
  • 内存使用不太可能导致您的问题,除非您的代码中存在阻止 GZIPOutputStream 关​​闭和释放其资源的错误。如果它正确地释放了它的资源,那么它对内存的使用与它是静态的没有什么不同。它只是不断分配和释放以及分配和释放与静态保留的相同数量的内存。
  • 您可以编写自己的类来使用 zlib 对仅分配一次的内存进行 gzip 压缩。 (这就是 Deflater 和 GZIPOutputStream 类所使用的。)zlib 提供了deflateReset(),其目的正是为了回收deflatreInit() 分配的内存用于新的压缩任务,而无需释放和分配。
  • 谢谢。是的,我可能正在寻找鬼魂。询问只是为了确保它是这样的。我怀疑每个特定的“新”,因为当调用 alloc 时,Android 会调用 GC,天知道会发生什么:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2011-04-11
相关资源
最近更新 更多