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。你在OP中提到的长值不是几个GB,而是100TB :)
之前
我会查看tablecloth。至于这个长值,我只是为了代码片段而编造的 :: 再次谢谢 !
...