2024 Clojure状态调查!中分享您的想法。

欢迎!有关如何使用本站,请参阅关于页面获取更多详细信息。

0
Clojure

我无法将nth用于long值作为索引

(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

这不仅仅是因为long类型与int类型有关,因为Clojure中的整数字面量始终是long类型。这是关于值的范围以及它不适合Java的int

我不知道确切的原因,但我可以猜测这个限制是由于实用性。
Java中的字符串数组都有适合于int尺寸的限制。泛型的List接口也可以仅使用int作为索引。

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

至于任何懒惰的或没有随机访问的数据,在高索引下使用nth将是一个耗时的反模式。这并不是说它永远不会需要,但如果确实需要它,那么这可能是一个强烈迹象表明,适合该问题的数据结构选择不当。

感谢您的回答。我在数据科学领域工作,并拥有非常大的数据集,占用了高达几个GB的RAM。
我理解了推理,我会寻找另一种方法。
对于大型数据块,一个常用的方法是使用适当的库而不是通用数据结构,例如 https://github.com/scicloj/tablecloth。您在原始帖子中发布的长值不是几个GB,而是一百TB :)。
我将查看tablecloth。至于这个长值,这只是我为了代码片段而编造的;再次感谢!
...