【问题标题】:replacing flat-file db with proper database with record level editing用适当的数据库替换平面文件数据库并进行记录级编辑
【发布时间】:2015-03-27 22:22:21
【问题描述】:

我无法在远程机器上安装 SQLite,所以我必须想办法在某种数据库结构中存储大量数据。

示例数据

key,values...
key,values....
..

目前在一个 20MB 的平面文件中有大约一百万行,我必须每小时读取文件中的每条记录和值并更新或添加一条记录。由于它是一个平面文件,我每次都必须重写整个文件。

我正在查看Storable 模块,但我认为它也按顺序写入数据。我只想编辑那些需要更改的记录。

随机记录的读取和更新是一项要求。添加可以在任何地方(顺序不重要)

任何人都可以提出一些建议吗?我如何知道是否可以在这些混合了 Solaris 和 Linux 的系统上设置本机 Berkeley 数据库文件?

________________终于______

最后我更好地理解了事情(谢谢大家),并且根据您的建议,我使用了 AnyDBM_File。它发现所有操作系统上都安装了 NDBM_File('C' 库)。到目前为止一切顺利。

只是为了检查它在现实世界中的表现。我运行了一个示例脚本来添加1 million records(我认为我可能在一天内获得的最大记录,通常在 500k 到 700k 之间)。天哪,它在我的磁盘上创建了一个 110G 数据文件!!!!所有的记录都是这样的:

a628234 = 0.178532683639599

我的意思是我的真实世界纪录比这更长。将其与保存 700k+ 条记录且磁盘上只有 15Mb 的平面文件进行比较。

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

再次感谢您的帮助。

【问题讨论】:

  • 您的平面文件是否有固定的记录长度,或者是逗号分隔的还是类似的?
  • 记录长度不是固定的,并且该值会根据程序逻辑而变化。此外,如果我使用这些各种 perl 模块 AnyDBM_File 或 DB_File。我的操作系统上还需要数据库服务器吗?
  • perldoc perlport 对 DBM 有这样的看法:“没有一个 DBM 模块可在所有平台上使用。SDBM_File 和其他模块通常在所有 Unix 和 DOSish 端口上都可用,但在 MacPerl 中不可用,其中只有 NBDM_File 和 DB_File 可用。好消息是至少应该有一些 DBM 模块可用,并且 AnyDBM_File 将使用它可以找到的任何模块。当然,代码需要相当严格,下降到最大公因数 (例如,每条记录不超过 1K),以便它适用于任何 DBM 模块。有关详细信息,请参阅 AnyDBM_File。"
  • 不,您不需要数据库服务器来使用 DBM。
  • ThisSuitIsBlackNot,谢谢。但是文档是否在谈论安装在操作系统中的 perl 模块 db libraris。在我的情况下,我环顾四周,发现:一台服务器上的 db.h 和另一台服务器上的 dbm.h。所以我理解所有这些 perl 模块只是实际数据库库的“连接器”,它们将单独安装在操作系统中?对吗?

标签: database perl flat-file


【解决方案1】:

正如他们在 cmets 中所说,您可以使用 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 2012-09-25
      • 1970-01-01
      • 2015-05-13
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多