我有一个Ruby脚本,可以对mysqldump
的输出执行一些替换。
输入可以有很长的行(数百MB),因为单行可以代表表中所有数据的多行INSERT语句。 mysqldump
实用程序可以强制每行生成一个INSERT语句,但我不能控制每个客户端。
我的脚本天真地希望IO#each_line
控制内存使用情况:
$stdin.each_line do |line|
next if options[:entity_excludes].any? { |entity| line =~ /^(DROP TABLE IF EXISTS|INSERT INTO) `custom_#{entity}(s|_meta)`/ }
line.gsub!(/^CREATE TABLE `/, "CREATE TABLE IF NOT EXISTS `")
line.gsub!('{{__OPF_SITEURL__}}', siteurl) if siteurl
$stdout.write(line)
end
我已经看到输入的最大行长超过400MB,这直接转换为进程常驻内存。
是否有用于Ruby的库,该库允许使用缓冲区而不是依赖行分隔输入来对输入流进行文本转换?
这被标记为simpler question的副本。但这还有很多。您需要跟踪多个缓冲区,并测试变换的应用,即使它们跨缓冲区边界应用也是如此。很容易出错,这就是为什么我希望库已经存在。