1

我有一个大约 4GB 的大文本文件,超过 800 万行,我正在编写一个 perl 脚本来逐行读取该文件,进行一些处理并将信息更新到 sybase,我以批处理方式执行此操作,1000每批更新提交的行数,但问题来了,起初,一个批处理只花费 10 到 20 秒,但随着处理的进行,更新一个批处理变得越来越慢,一个批处理花费 3 到 4 分钟,我肯定有不知道为什么会这样!任何机构都可以帮助我分析这可能是什么原因?提前谢谢,在我的膝盖上...

4

1 回答 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 回答