Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala压缩_Scala_Vector_Compression_Long Integer_Bits - Fatal编程技术网

Scala压缩

Scala压缩,scala,vector,compression,long-integer,bits,Scala,Vector,Compression,Long Integer,Bits,我正在使用非常大的Int列表(可能很大)处理Scala,我需要压缩它们并将其保存在内存中 唯一的要求是,我可以拉(和解压缩)列表中的第一个数字来处理,而不涉及列表的其余部分 我有很多好主意,但大多数都是把数字翻译成比特。 例如: 您可以将任意数字x写成元组| log(x)|,x-| log(x)|第一个元素,我们将其作为1的字符串,最后是0(一元代码),第二个元素是二进制的。e、 g: 1->0,1->0 1 5->2,1->110 01 8->3,0->1110000 9->3,1->11

我正在使用非常大的Int列表(可能很大)处理Scala,我需要压缩它们并将其保存在内存中

唯一的要求是,我可以拉(和解压缩)列表中的第一个数字来处理,而不涉及列表的其余部分

我有很多好主意,但大多数都是把数字翻译成比特。 例如:

您可以将任意数字x写成元组| log(x)|,x-| log(x)|第一个元素,我们将其作为1的字符串,最后是0(一元代码),第二个元素是二进制的。e、 g:

1->0,1->0 1

5->2,1->110 01

8->3,0->1110000

9->3,1->1110 001

虽然Int需要固定的32位内存和长的64位,但通过这种压缩,x需要2log(x)位存储,并且可以无限增长。在大多数情况下,这种压缩确实会减少记忆

您将如何处理此类数据?是否有诸如位数组之类的东西

在Scala中压缩此类数据还有其他方法吗


谢谢

根据数据集的稀疏性和范围,您可以将数据保留为增量列表而不是数字。例如,它用于声音压缩,可以是有损的,也可以是无损的,这取决于你的需要

例如,如果您有
Int
数字,但知道它们之间几乎不会超过一个(有符号的)
Byte
,则可以执行如下字节列表:

-1           // Use -1 to imply the next number cannot be computed as a byte delta
0, 0, 4, 0   // 1024 encoded as bytes
1            // 1025 as a delta
-5           // 1020 as a delta
-1           // Next number can't be computed as a byte delta
0, 0, -1, -1 // 65535 encoded as bytes -- -1 doesn't have special meaning here
10           // 65545 as a delta
因此,您不必使用这种特定的编码来处理位。但是,事实上,如果没有对特定问题、数据特征等的非常明确的指示,你就不会得到好的答案

重读您的问题,您似乎并没有放弃将数据转换为比特的压缩技术。如果没有,那么我建议哈夫曼——如果需要的话,可以预测——或者莱佩尔·齐夫家族的东西


不幸的是,Scala没有处理二进制数据的库。尽管paulp在编译器中可能有类似的功能。

您的列表有多大?也许你不需要那种花哨的步法。否则,听起来好像你有一个非常具体的问题,你不太可能从盒子里得到什么。列表可能有数百万条条目,它们将从光盘中读取/写入,并一次处理许多条目。因此,压缩也将有助于提高性能(我认为减少I/O)。我希望有人知道在Scala中表示这样一个列表的更好方法(可能是byteArray,我不知道),这一定是一个值列表吗?它可能是一个集合吗?所有的值都是均匀分布的?我建议你把Scala从你的问题中去掉,让它成为关于算法的,语言无关的。谢谢,这是个好主意。我想我们可以使用字节数组来“打包”位。它将用作位的列表(以8为一组打包)。你认为这在性能方面可行吗?