Perl Win32::OLE 生成访问数据库
Posted
技术标签:
【中文标题】Perl Win32::OLE 生成访问数据库【英文标题】:Perl Win32::OLE Generating Access Database 【发布时间】:2011-11-23 22:45:34 【问题描述】:全部,
[描述]:我正在读取平面文件列表并生成和加载访问数据库。 Windows XP、Perl 5.8.8,并且无法访问默认安装之外的其他模块。
[问题]:性能、性能、性能。加载所有数据大约需要 20 分钟。我假设可能有更好的方法来加载数据而不是 addnew & update。
[逻辑]:没有发布我的很多转换和附加逻辑,这就是我正在尝试的:
-
打开文件 x
读取文件 x 的第 0 行
jet->从步骤 2 导出的字符串执行 Create 语句
读取第 1 - n 行,创建制表符分隔的字符串并存储到数组中
使用 select * from tablename 打开记录集
对于数组中的每一项
-
记录集->新增
根据标签拆分项目
-
对于拆分中的每个项目
-
rs->Fields->Item(pos)->Value = item_value
谢谢。
【问题讨论】:
20 分钟内加载了多少行?每行有多少列(字段)?输入文件总共有多大字节?您是否在加载期间创建索引? 【参考方案1】:缓慢加载的一个问题是每次更新都进行提交。确保关闭自动提交并每 1000 行执行一次或其他。如果它不是一个巨大的负载,就不要这样做。另外,不要在加载过程中创建索引,以后再创建。
另外,我不确定 OLE 是否是执行此操作的最佳方式。我一直使用 DBI 和 Win32::ODBC 加载 Access db。速度很快。
根据请求,这里是示例加载程序,在 WinXP、Access 2003、ActiveState Perl 5.8.8 上每分钟执行大约 10 万条记录。
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;
【讨论】:
负载比我想要的访问数据库要大。我相信我正在加载大约 300k 行。你能把你的 dbi 代码的样本发给我吗?以上是关于Perl Win32::OLE 生成访问数据库的主要内容,如果未能解决你的问题,请参考以下文章
win32client dispatch在python中失败,而win32 :: ole new在perl中成功运行for com dll
perl tk将界面输入的汉字不能输出到读取的EXCEL表格