如何将其更改为内存不足?

时间:2018-06-15 04:28:24

标签: crystal-lang

所以基本上这是试图生成一个大小为N的文字广告。这是一个非常天真的算法,因为它在我的单词列表中弄清楚每个组合(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的水晶,所以我不知道我在这里做什么。任何提示将在这里赞赏!我希望我已经清楚地说明了我在这里要做的事情,但如果需要我可以添加更多细节。

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?
# :(

1 个答案:

答案 0 :(得分:1)

您希望使用Array#each_combination,将reuse设置为true以节省最多内存。在这种情况下,不要留下或修改传递给你的阵列。