gpt4 book ai didi

ruby - 无法在 Ruby 中分配内存(无 MemoryError)?

转载 作者:数据小太阳 更新时间:2023-10-29 07:04:39 26 4
gpt4 key购买 nike

我写了一个简单的脚本,它应该读取整个目录,然后通过去除 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 是 source << tmp_src .失败的文件是最大的文件 (3.8 GB)。这里有什么问题?为什么即使我有足够的内存也会出现此错误?还有我该如何解决?

最佳答案

问题出在这两行:

source << tmp_src
source << tmp_src.gsub( /\s{2,}/, "\n" )

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

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

# source << tmp_src
out1.write(tmp_src)

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

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

关于ruby - 无法在 Ruby 中分配内存(无 MemoryError)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23520758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com