Mysql 逐行读取文件而不将整个文件加载到内存中
我正在处理一个50 Gb的MySQL导出文件,并对其执行一系列脚本操作,以将其转换为SQLite3可加载表单(我从这里获得了线索:)。我没有研究MySQL转储的结构,数据是从第三方获得的。我可以看到它有CREATETABLE和insert into语句,但由于其大小,很难手动读取和理解其结构。 由于大小的原因,通过管道传输文件将不起作用。还有一个bash脚本,用于加载文件,然后逐行处理,例如Mysql 逐行读取文件而不将整个文件加载到内存中,mysql,perl,bash,sqlite,bigdata,Mysql,Perl,Bash,Sqlite,Bigdata,我正在处理一个50 Gb的MySQL导出文件,并对其执行一系列脚本操作,以将其转换为SQLite3可加载表单(我从这里获得了线索:)。我没有研究MySQL转储的结构,数据是从第三方获得的。我可以看到它有CREATETABLE和insert into语句,但由于其大小,很难手动读取和理解其结构。 由于大小的原因,通过管道传输文件将不起作用。还有一个bash脚本,用于加载文件,然后逐行处理,例如 while read line <do something> 其中x保存行号,然后通过pe
while read line
<do something>
其中x保存行号,然后通过perl命令发送temp,最后附加到输出文件
然而,虽然一开始速度很快,但它很快就慢了下来,因为它从一开始就必须迭代越来越多的行。大约有40000行
有人做过这样的工作吗?有更快的方法吗?只需一次处理一行即可:
while read -r line
do
echo "$line" > temp
…process temp with Perl, etc…
done < file
未测试代码
调用:
perl wrapper.pl <file >output
perl wrapper.pl输出
为什么脚本必须迭代越来越多的行?我想您没有40000个文件,每个文件都包含一行,但是您能提供一些详细信息吗?命令$sed-n'10{p;q}'文件将读取前9行,然后给我第10行并退出sed。随着数字增加到40000,它必须迭代更多行才能得到具体的一行。好的,我明白了。。例如,是否可以先将文件拆分为50个1Gb文件?然后对每个区块进行处理,最后再次加入区块..我在超级计算机上可以拥有的文件数量有限,因此尽管50太多,但我可以尝试获得一个比1更好的最大数量。谢谢你的引导。也许你也可以发布你正在使用的脚本?(如果它很大,你可以尝试上传到pastebin.com,并在这里提供链接)。。
#!/usr/bin/env perl
use strict;
use warnings;
my $file = "temp";
while (<>)
{
open my $fh, ">", $file or die;
print $fh $_;
close $fh;
system "perl", "script.pl", $file;
}
perl wrapper.pl <file >output