我无法在远程计算机上安装SQLite,因此我必须找到一种方法来将大量数据存储在某种数据库结构中。
示例数据
key,values...
key,values....
..
目前在20MB平面文件中有大约一百万行,每小时我必须读取文件中的每个记录和值并更新或添加记录。由于它是一个平面文件,我每次都要重写整个文件。
我正在查看Storable
模块,但我认为它还会按顺序写入数据。我只想编辑那些需要更改的记录。
读取和更新随机记录是必需的。添加可以在任何地方(顺序并不重要)
有人能提出什么建议吗?我怎么知道我是否可以在这些系统上设置本机Berkeley数据库文件,这些系统是Solaris和Linux的混合体?
________________最后__________________
最后我更了解事情(谢谢大家),根据你的建议,我使用了AnyDBM_File。它发现所有操作系统上都安装了NDBM_File(' C'库)。到目前为止一切都很好。
只是为了检查它在现实世界中的表现。我运行了一个示例脚本来添加1 million records
(我认为我可能在一天中获得的最大记录,通常在500k到700k之间)。 OMG在我的磁盘上创建了一个 110G数据文件!并且所有记录都像:
a628234 = 0.178532683639599
我的意思是我的真实世界记录比这长。将其与保存真实700k +记录的平面文件进行比较,磁盘上只有15Mb。
我对此的缓慢和臃肿感到失望,所以现在我想我会在每次需要编辑时写下整个文件来付出代价。
再次感谢您的帮助。
答案 0 :(得分:0)
正如他们在评论中所说,您可以使用SDBM_File模块。例如:
#!/usr/bin/perl
use strict;
use warnings;
use v5.14;
use Fcntl;
use SDBM_File;
my $filename = "dbdb";
my %h;
tie %h, 'SDBM_File', $filename, O_RDWR|O_CREAT, 0666
or die "Error: $!\n";
# To run only one time to fill the dbdb file.
# Next time you may delete this line and
# the output will be the same "16,40".
$h{$_} = $_ * 2 . "," . $_ * 5 for 1..100;
say $h{8};
untie %h;
输出:16,40
答案 1 :(得分:-1)
取决于您的程序逻辑需要什么,但一种解决方案是基于密钥对数据库进行分区。因此,您可以处理许多较小的文件而不是一个大文件。