Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 逐行读取文件而不将整个文件加载到内存中_Mysql_Perl_Bash_Sqlite_Bigdata - Fatal编程技术网

Mysql 逐行读取文件而不将整个文件加载到内存中

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

我正在处理一个50 Gb的MySQL导出文件,并对其执行一系列脚本操作,以将其转换为SQLite3可加载表单(我从这里获得了线索:)。我没有研究MySQL转储的结构,数据是从第三方获得的。我可以看到它有CREATETABLE和insert into语句,但由于其大小,很难手动读取和理解其结构。 由于大小的原因,通过管道传输文件将不起作用。还有一个bash脚本,用于加载文件,然后逐行处理,例如

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