此代码成功生成包含5个字符的所有可能字母组合的数组。
a = ('aaaaa'..'zzzzz').to_a
然而,当我尝试使用6个以上的角色时,需要10分钟,然后才能完成任务。它是否有任何方法可以在不杀死任务的情况下实际加载?它受硬件限制吗?
答案 0 :(得分:4)
你确实受到硬件的限制。在过于简化的术语中,您在这里面临两个限制 - 处理能力和内存容量。
" k-permutations of n"公式将告诉我们您正在尝试生成和处理26**6 = 308_915_776
元素。
(x..y)
创建了一个Range
,它知道如何生成所有元素,但并不急于这样做。但是,当您调用Range#to_a
时,您的处理器会尝试生成所有这些元素。一段时间后,该过程耗尽内存并死亡。
为了避免内存限制,您可以利用Range
也是Enumerable
这一事实。例如:
('aaaaaaa'..'zzzzzzz').each { |seven_letter_word| puts seven_letter_word }
会立即开始打印字符串。最终(经过大量的等待)它将遍历所有这些。
但是,请注意,这将允许您绕过内存限制,但不能处理处理内存限制。除此之外,没有捷径可以理解手头问题的具体细节。