我有一个大约4GB的大文本文件,超过800万行,我正在写一个perl脚本来逐行读取这个文件,做一些处理并将信息更新到sybase,我是批量做的方式,每批1000行用于更新提交,但问题是,首先,批处理只花费10到20秒,但随着处理的进行,更新批处理变得越来越慢,批处理成本为3到4分钟,我绝对不知道为什么会这样!任何机构都可以帮助我分析这可能是什么原因?提前谢谢,在我的膝盖上...
答案 0 :(得分:0)
==>我正在写一个perl脚本来逐行读取这个文件,做一些处理并将信息更新到sybase
请一次完成整个处理,一次性处理您的源文件;根据需要使用散列,数组准备数据结构,然后开始将数据插入数据库。
在将大数据插入数据库时,请牢记以下几点。
1-如果每个列数据都不是太大,那么您也可以一次性插入整个数据。(您可能需要良好的RAM,不确定大小,因为它取决于您需要处理的数据集)。
2-你应该使用perl DBI的execute_array,这样你就可以一次插入数据。
3-如果您没有足够的RAM来一次插入数据,请分配您的数据(可能是8部分,每次100万行)。
4-同时确保您准备一次声明。在每次运行中,您只是使用新数据集执行。
5-关闭auto_commit。
使用perl DBI的execute_array的示例代码。我用它将大约1000万个数据插入到mysql中。
请将数据保存在数组中,如下所示。 @ column1_data,@ column2_data,@ column3_data
print $logfile_handle, "Total records to insert--".scalar(@column1_data);
print $logfile_handle, "Inserting data into database";
my $sth = $$dbh_ref->prepare("INSERT INTO $tablename (column1,column2,column3) VALUES (?,?,?)")
or print ($logfile_handle, "ERROR- Couldn't prepare statement: " . $$dbh_ref->errsr) && exit;
my $tuples = $sth->execute_array(
{ ArrayTupleStatus => \my @tuple_status },
\@column1_data,
\@column2_data,
\@column3_data
);
$$dbh_ref->do("commit");
print ($logfile_handle,"Data Insertion Completed.");
if ($tuples) {
print ($logfile_handle,"Successfully inserted $tuples records\n");
} else {
##print Error log or those linese which are not inserted
my $status = $tuple_status[$tuple];
$status = [0, "Skipped"] unless defined $status;
next unless ref $status;
print ($logfile_handle, "ERROR- Failed to insert (%s,%s,%s): %s\n",
$column1_data[$tuple], $column2_data[$tuple],$column3_data[$tuple], $status->[1]);
}
}