大佬教程收集整理的这篇文章主要介绍了无法在Ruby中分配内存(No MemoryError)?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有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,请注明来意。