Perl Win32::OLE生成Access数据库
全部, [说明]:我正在读取平面文件列表,并生成和加载access数据库。Windows XP、Perl 5.8.8,并且无法访问默认安装之外的其他模块 [问题]:绩效,绩效,绩效。加载所有数据大约需要20分钟。我假设有更好的方法来加载数据,而不是添加新的和更新 [Logic]:在不发布大量转换和附加逻辑的情况下,我正在尝试:Perl Win32::OLE生成Access数据库,perl,ms-access,Perl,Ms Access,全部, [说明]:我正在读取平面文件列表,并生成和加载access数据库。Windows XP、Perl 5.8.8,并且无法访问默认安装之外的其他模块 [问题]:绩效,绩效,绩效。加载所有数据大约需要20分钟。我假设有更好的方法来加载数据,而不是添加新的和更新 [Logic]:在不发布大量转换和附加逻辑的情况下,我正在尝试: 打开文件x 读取文件x的第0行 jet->从步骤2中导出的字符串执行Create语句 读取第1-n行,创建制表符分隔的字符串并存储到数组中 使用select*from t
谢谢。慢加载中的一个问题是在每次更新时进行提交。确保“自动提交”处于禁用状态,并每1000行执行一次或其他操作。如果这不是一个巨大的负担,就不要做。另外,不要在加载期间创建索引,而是在加载之后创建索引 另外,我不确定OLE是否是最好的方法。我一直使用DBI和Win32::ODBC加载Access数据库。进展很快 根据请求,这里是示例加载程序,在WinXP、Access 2003、ActiveState Perl 5.8.8上每分钟执行大约100k条记录
use strict;
use warnings;
use Win32::ODBC;
$| = 1;
my $dsn = "LinkManagerTest";
my $db = new Win32::ODBC($dsn)
or die "Connect to database $dsn failed: " . Win32::ODBC::Error();
my $rows_added = 0;
my $error_code;
while (<>) {
chomp;
print STDERR "." unless $. % 100;
print STDERR " $.\n" unless $. % 5000;
my ($source, $source_link, $url, $site_name) = split /\t/;
my $insert = qq{
insert into Links (
URL,
SiteName,
Source,
SourceLink
)
values (
'$url',
'$site_name',
'$source',
'$source_link'
)
};
$error_code = $db->Sql($insert);
if ($error_code) {
print "\nSQL update failed on line $. with error code $error_code\n";
print "SQL statement:\n$insert\n\n";
print "Error:\n" . $db->Error() . "\n\n";
}
else {
$rows_added++;
}
$db->Transact('SQL_COMMIT') unless $. % 1000;
}
$db->Transact('SQL_COMMIT');
$db->Close();
print "\n";
print "Lines Read: $.\n";
print "Rows Added: $rows_added\n";
exit 0;
使用严格;
使用警告;
使用Win32::ODBC;
$| = 1;
my$dsn=“LinkManagerTest”;
my$db=新Win32::ODBC($dsn)
或“连接到数据库$dsn失败:”。Win32::ODBC::Error();
我的$rows\u added=0;
我的$error\u代码;
而(){
咀嚼;
打印标准“.”,除非$.%100;
打印标准“$。\n”,除非$.%5000;
我的($source、$source\u link、$url、$site\u name)=拆分/\t/;
我的$insert=qq{
插入链接(
网址,
站点名称,
来源:,
源链接
)
价值观(
“$url”,
“$site_name”,
“$source”,
“$source_link”
)
};
$error\u code=$db->Sql($insert);
如果($error\u code){
打印“\nSQL更新在第$行失败,错误代码为$error\U code\n”;
打印“SQL语句:\n$insert\n\n”;
打印“错误:\n”。$db->Error()。\n\n”;
}
否则{
$rows_已添加++;
}
$db->Transact('SQL_COMMIT'),除非$.%1000;
}
$db->Transact('SQL_COMMIT');
$db->Close();
打印“\n”;
打印“行读取:$。\n”;
打印“添加的行:$Rows\u Added\n”;
出口0;
在20分钟内加载了多少行?每行有多少列(字段)?输入文件总共有多大字节?您是否在加载期间创建索引?加载比我希望的access数据库的加载大。。我相信我正在加载大约30万行。你能给我一个你的dbi代码的样本吗?