我怎样才能将其更改为不 运行 内存不足?

How can I change this to not run out of memory?

所以基本上这是在尝试生成一个大小为 N 的 wordsquare。这是一个非常幼稚的算法,因为它会破坏我的单词列表中的每个组合 (N)。但是,我稍微阅读了文档,我认为添加 .each 会使这不会将所有这些都放在堆上?我不太确定这一切实际上是如何工作的,但它确实看起来应该有效。

它适用于 N=2,但适用于任何高于此的值:

GC 警告:无法将堆扩展 8388608 字节 GC 警告:无法将堆扩展 8388608 字节 GC 警告:无法将堆扩展 65536 字节 GC 警告:内存不足!堆大小:2967 MiB。返回 NULL! 地址 0xc 处的无效内存访问(信号 11) [0x5d700] *CallStack::print_backtrace:Int32 +104 [0x5222c] __crystal_sigfault_handler +84

我从 Ruby 来到 crystal,所以我并不知道我在这里做什么。任何提示将不胜感激!我希望我已经清楚地说明了我在这里要做的事情,但如果需要,我可以添加更多细节。

def wordsquare(n)
  words = File.read_lines("../txt/data/scrabble.txt").map{ |s| s.chomp }.select { |w| w.size == n }
  words
    .combinations(n).each
    .select do |combo|
      (0...n).all? { |idx| words.includes?(combo.map { |cmb| cmb[idx] }.join) }
    end
end

p wordsquare(3).first(1)

# why is it running out of memory even though it's an iterator?
# :(

您想使用 Array#each_combination,将 reuse 设置为 true 以最大程度地节省内存。在这种情况下,不要保留或修改交给您的数组。