通过记录级编辑将平面文件数据库替换为适当的数据库
replacing flat-file db with proper database with record level editing
我无法在远程机器上安装 SQLite,所以我必须想办法在某种数据库结构中存储大量数据。
示例数据
key,values...
key,values....
..
目前在一个 20MB 的平面文件中大约有一百万行,每小时我都必须读取文件中的每条记录和值并更新或添加一条记录。由于它是一个平面文件,我每次都必须重写整个文件。
我正在查看Storable
模块,但我认为它也是顺序写入数据。我只想编辑那些需要更改的记录。
读取和更新 运行dom 记录是一项要求。添加可以在任何地方(顺序不重要)
任何人都可以提出建议吗?我怎么知道我是否可以在这些混合了 Solaris 和 Linux 的系统上设置本机 Berkeley 数据库文件?
________________finally__________________
终于我更好地理解了事情(谢谢大家),并且根据你的建议我使用了 AnyDBM_File。它发现 NDBM_File('C' 库)安装在所有 OS 上。到目前为止一切顺利。
只是为了检查它在现实世界中的表现。我 运行 一个添加 1 million records
的示例脚本(我认为我一天可能获得的最大记录,通常在 500k 到 700k 之间)。天哪,它在我的磁盘上创建了一个 110G 数据文件 !!!!所有的记录都是这样的:
a628234 = 0.178532683639599
我的意思是我的真实世界记录比那长。将此与保存现实生活中 700k+ 记录并且磁盘上只有 15Mb 的平面文件进行比较。
我对它的 缓慢和臃肿 感到失望,所以现在我认为每次需要编辑时我都会通过编写整个文件来付出代价。
再次感谢您的帮助。
取决于您的程序逻辑需要什么,但一种解决方案是基于键对数据库进行分区。因此您可以处理许多小文件而不是一个大文件。
正如他们在评论中所说,您可以使用 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
我无法在远程机器上安装 SQLite,所以我必须想办法在某种数据库结构中存储大量数据。
示例数据
key,values...
key,values....
..
目前在一个 20MB 的平面文件中大约有一百万行,每小时我都必须读取文件中的每条记录和值并更新或添加一条记录。由于它是一个平面文件,我每次都必须重写整个文件。
我正在查看Storable
模块,但我认为它也是顺序写入数据。我只想编辑那些需要更改的记录。
读取和更新 运行dom 记录是一项要求。添加可以在任何地方(顺序不重要)
任何人都可以提出建议吗?我怎么知道我是否可以在这些混合了 Solaris 和 Linux 的系统上设置本机 Berkeley 数据库文件?
________________finally__________________
终于我更好地理解了事情(谢谢大家),并且根据你的建议我使用了 AnyDBM_File。它发现 NDBM_File('C' 库)安装在所有 OS 上。到目前为止一切顺利。
只是为了检查它在现实世界中的表现。我 运行 一个添加 1 million records
的示例脚本(我认为我一天可能获得的最大记录,通常在 500k 到 700k 之间)。天哪,它在我的磁盘上创建了一个 110G 数据文件 !!!!所有的记录都是这样的:
a628234 = 0.178532683639599
我的意思是我的真实世界记录比那长。将此与保存现实生活中 700k+ 记录并且磁盘上只有 15Mb 的平面文件进行比较。
我对它的 缓慢和臃肿 感到失望,所以现在我认为每次需要编辑时我都会通过编写整个文件来付出代价。
再次感谢您的帮助。
取决于您的程序逻辑需要什么,但一种解决方案是基于键对数据库进行分区。因此您可以处理许多小文件而不是一个大文件。
正如他们在评论中所说,您可以使用 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