Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了无法在Ruby中分配内存(No MemoryError)?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我编写了一个简单的脚本,它应该读取整个目录,然后通过删除 HTML标记将 HTML数据解析为普通脚本,然后将其写入一个文件.

我有8GB内存和大量可用的虚拟内存.当我这样做时,我有超过5GB的RAM可用.目录中最大的文件是3.8 GB.

脚本是

file_count = 1
File.open("allscraped.txt",'w') do |out1|
    for file_name in Dir["allParts/*.dat"] do
        puts "#{file_name}#:#{file_count}"
        file_count +=1
        File.open(file_name,"r") do |file|
            source = ""
            tmp_src = ""
            counter = 0
            file.each_line do |line|
                scraped_content = line.gsub(/<.*?\/?>/,'')
                tmp_src << scraped_content
                if (counter % 10000) == 0
                    tmp_src = tmp_src.gsub( /\s{2,}/,"\n" )
                    source << tmp_src
                    tmp_src = ""
                    counter = 0
                end
                counter += 1
            end
            source << tmp_src.gsub( /\s{2,"\n" )
            out1.write(sourcE)
            break
        end
    end
end

完整的错误代码是:

realscraper.rb:33:in `block (4 levels) in <main>': failed to allocate memory (No
MemoryError)
        from realscraper.rb:27:in `each_line'
        from realscraper.rb:27:in `block (3 levels) in <main>'
        from realscraper.rb:23:in `open'
        from realscraper.rb:23:in `block (2 levels) in <main>'
        from realscraper.rb:13:in `each'
        from realscraper.rb:13:in `block in <main>'
        from realscraper.rb:12:in `open'
        from realscraper.rb:12:in `<main>'

第27行是file.each_line do | line |和33是源<< tmp_src.失败的文件是最大的文件(3.8 GB).这里有什么问题?即使我有足够的内存,为什么我会收到此错误?另外我该如何解决?

解决方法

问题出在以下两个方面:
source << tmp_src
source << tmp_src.gsub( /\s{2,"\n" )

当您读取大文件时,您正在内存中慢慢增长一个非常大的字符串.

最简单的解决方案是根本不使用此临时源字符串,而是将结果直接写入文件.只需用这个替换这两行:

# source << tmp_src
out1.write(tmp_srC) 

# source << tmp_src.gsub( /\s{2,"\n" )
out1.write(tmp_src.gsub( /\s{2,"\n" ))

这样你就不会在内存中创建任何大的临时字符串,它应该以这种方式更好(更快)地工作.

大佬总结

以上是大佬教程为你收集整理的无法在Ruby中分配内存(No MemoryError)?全部内容,希望文章能够帮你解决无法在Ruby中分配内存(No MemoryError)?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。