请分享您的想法,参加 2024年Clojure调查!

欢迎!请查看关于页面以获取更多此网站的信息。

0 投票
Clojure

我将nth用于长值作为索引时无法工作

(nth (cycle [:a]) 12321123212397) => 运行时错误 (ArithmeticException) 在 java.lang.Math/toIntExact (Math.java:1371)。整数溢出

即使显式尝试强制转换到Long也会出现同样的问题

(nth (cycle [:a]) (long 12321123212397)) => 运行时错误 (ArithmeticException) 在 java.lang.Math/toIntExact (Math.java:1371)。整数溢出

欢迎提出建议,谢谢!

1 答案

+1 投票

这不是关于长和int类型的问题,因为在Clojure中整数数字字面量总是long类型。这是关于值的范围和它不能适应Java的int

我不确定,但我可以推测这个限制是由于实际原因。
Java中的字符串和数组有一个适合int的大小限制。通用的List接口也可以只用int作为索引。

同样的,对于索引Clojure集合。虽然从理论上讲,Clojure的持久向量可以使用long作为基础索引类型,因为它们依赖于大小为32的数组,但这并不实用,因为即使是一个含有Integer/MAX_VALUE的8字节值的简单数组也将占用17 GB的RAM,而持久向量并不是简单的数组。

至于任何惰性或无随机访问的集合,使用nth来获取高索引将是一个非常耗时的时间反模式。这并不是说它永远不需要,但是需要它的人强烈表明已经选择了错误的数据结构来处理该问题。

}} by
感谢您的回答。我从事数据科学领域,我们确实有非常大的数据集,占用高达几个GB的RAM。
虽然我理解了推理,但我将寻找另一种方法。
}} by
对于大型数据块,一个常见的做法是使用适当的库而不是通用的数据结构,例如 https://github.com/scicloj/tablecloth。您在原始帖子中提出的长值不是几个GB,而是100TB。
}} by
我会看看tablecloth。至于那个长值,我只是为了代码片段编造的一个值;谢谢!
...