高效压缩/序列化/处理大量数据的方法

4 投票
3 回答
539 浏览
提问于 2025-04-17 15:09

我有一个文件,里面有25,000个浮点数(用逗号分隔),总共有大约100,000行。文件中的一行大概是这样的:

1689.97,-9643.39,-82082.1,9776.09,-33974.84,-67247.38,32997.34,72811.53,31642.87,-949.6,9340.68,-85854.48,-17705.36,187.74,-3002.6,-35812.21,37382.32,22770.78,40893.09,45743.99,-6500.92,26243.85,13975.95,0,56669.47,-25865.36,-17066.78,26788.57,0,-36554.86,-3687.19,18933.93

我有两个问题。

  1. 有没有办法(用Java或Python)高效地压缩数据,同时又不影响性能太多?压缩工作每天只需要做一次,但数据需要经常读取。
  2. 能不能在压缩的数据中进行操作,比如我想在不解压的情况下,对前10列的前10行进行求和。这样我就不用担心频繁读取压缩数据的问题。其中一个挑战是要把25,000个字符串转换成浮点数来进行加法运算。

我看过gzipzcat,它们是不错的选择。但我想找一些压缩或序列化的算法,能够通过Java/Python存储数据,并且在不解压的情况下进行读取。

3 个回答

0

使用 DataOutPutStream 并调用 writeFloat 方法,这样你就不需要使用逗号来分隔了。

0

与其把内容写成文字,不如把它写成字节。你需要把基本数据类型转换成字节数组,虽然这样做有点麻烦,但我觉得并不难。你可以使用 Float.floatToRawIntBits() 这个方法把浮点数转换成整数,然后用 Float.intBitsToFloat() 方法把整数再转换回浮点数。把整数转换成字节数组其实只需要进行几次位移操作。

3

在Java中,你可以用一个叫做 GZIPOutputStream 的东西来包装你的 OutputStream,这样可以在数据输出的时候进行压缩。同时,你也可以用 GZIPInputStream 来包装你的 InputStream,这样在读取数据的时候就可以进行解压缩。这一切都是通过GZIP算法来实现的,能够让你的数据在传输时占用更少的空间。

撰写回答