使用具有记录级别编辑的适当数据库替换平面文件数据库

时间:2015-03-27 22:22:22

标签: database perl flat-file

我无法在远程计算机上安装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。

我对此的缓慢和臃肿感到失望,所以现在我想我会在每次需要编辑时写下整个文件来付出代价。

再次感谢您的帮助。

2 个答案:

答案 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)

取决于您的程序逻辑需要什么,但一种解决方案是基于密钥对数据库进行分区。因此,您可以处理许多较小的文件而不是一个大文件。