我有一个大约 4GB 的大文本文件,超过 800 万行,我正在编写一个 perl 脚本来逐行读取该文件,进行一些处理并将信息更新到 sybase,我以批处理方式执行此操作,1000每批更新提交的行数,但问题来了,起初,一个批处理只花费 10 到 20 秒,但随着处理的进行,更新一个批处理变得越来越慢,一个批处理花费 3 到 4 分钟,我肯定有不知道为什么会这样!任何机构都可以帮助我分析这可能是什么原因?提前谢谢,在我的膝盖上...
问问题
186 次
1 回答
0
==>我正在编写一个perl脚本来逐行读取这个文件,做一些处理并将信息更新到sybase
请一次性完成整个处理意味着一次性处理您的源文件;根据要求使用哈希、数组准备数据结构,然后开始将数据插入数据库。
在将大数据插入数据库时,请牢记以下几点。
1-如果每列数据不是太大,那么您也可以一次性插入整个数据。(您可能需要良好的 RAM,但不确定大小,因为它取决于您需要处理的数据集)。
2-您应该使用perl DBI的execute_array,以便您可以一次性插入数据。
3- 如果您没有足够的 RAM 一次性插入数据,请分配您的数据(可能分为 8 部分,每次 100 万行)。
4-还要确保您准备了一次声明。在每次运行中,您只是在使用新数据集执行。
5- 关闭您的 auto_commit。
使用 perl DBI 的 execute_array 的示例代码。我已经使用它向 mysql 中插入了大约 1000 万条数据。
请以数组的形式将您的数据保存在数组中,如下所示。@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]);
}
}
于 2013-10-26T10:53:38.163 回答