【发布时间】: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