Ruby迭代器内存膨胀

时间:2015-08-05 09:32:04

标签: ruby memory memory-management iterator out-of-memory

该代码用于一个软件(API)中的脚本控制台。该软件是一个文档审查平台。一旦用户浏览了文档并标记了哪些文档是相关的,它们就成为current_selected_items。我们要做的是抓住每个文档并与其他文档进行比较以过滤掉重复文档。当我们通过迭代器执行此操作时,每个文档都会被加载并且永远不会丢失,从而创建膨胀,因为有数百万个文档。最终的崩溃是“内存不足”,执行终止。

我们如何使用迭代器但一次只处理一定数量的文档或将内存使用量设置为最大值?

$current_selected_items.each do |item|
    counter += 1
    if counter % 5000 == 0
        processing_elapsed = Time.at(Time.now - start_time).gmtime.strftime("%H:%M:%S")
        puts "[#{processing_elapsed}] #{counter}/#{num_items_selected} documents done, #{processed_items.count} duplicates processed"
    end

    next if processed_items.include? item

    processed_items << item
    dupes = item.get_duplicates

    next if dupes.count == 0

    master_text = item.get_text_object.to_string
    is_text_consistent = true

    dupes.each do |dupe_item|
        processed_items << dupe_item

        dupe_text = dupe_item.get_text_object.to_string
        if dupe_text == "" then next end

        unless master_text.eql? dupe_text
            is_text_consistent = false
            break
        end
    end

0 个答案:

没有答案