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

欢迎!请查看关于页面获取更多关于此的作用信息。

0
ago 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
ago

这并不是关于Long和int类型之间的区别,因为Clojure中的整数数字字面量始终是long类型。这是关于值的范围以及它不适用于Java的int

我不知道这是否确定,但可以推测这个限制是出于实用性的考虑。
Java中的字符串和数组有大小限制,这个限制可以放入int。通用List接口也可以只用int来索引。

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

至于懒惰的或没有随机访问的功能,使用高索引的nth将会是一个费时的反模式。这并不是说它永远不会需要,但需要它的人是一个强烈的信号,表明为专门的问题选择了错误的数据结构。

谢谢你的回答。我从事数据科学工作,我们确实有一些非常大的数据集,它们需要用到几个GB的RAM。
我明白你的推理,我会寻找另一种方法的。
对于大型数据块,一个常用的方法是用适当的库代替通用数据结构,例如https://github.com/scicloj/tablecloth。你发布的OP中的长值不是几个GB,而是100TB :)。
我会看看tablecloth。至于那个长值,我只是为了代码片段编造的一个数据;)再次感谢!
...