在我的应用程序中,我需要在memroy和磁盘中存储一些简单的数据。在我的情况下,真正的数据库将是过度的,所以我需要更轻的数据库来处理简单的数据持久性要求。我自己做了一些谷歌搜索,发现了一些有趣的东西,如DBM和DBI CVS等,但由于有太多选项,所以我很难做出实际选择,所以我想在这里问你这个“最佳实践”,如perl中的轻量级数据持久性解决方案。
答案 0 :(得分:15)
您有几种选择:
Storable是一个核心模块,效率很高。 h as some problems with portability,例如使用旧版Storable的人可能无法读取您的数据。此外,创建和检索该数据的系统的字节顺序非常重要。网络订单stoarge选项有助于减少可移植性问题。您可以将任意嵌套数据结构存储到文件或字符串并还原它。只有Perl支持Storable。
YAML是一种基于文本的格式,可以像存储一样工作 - 您可以在YAML文件中存储和恢复任意结构。 YAML很好,因为有几种语言的YAML库。它不像Storable那样快速或节省空间。
JSON是一种流行的数据交换格式,支持多种语言。这与YAML的优点和缺点非常相似。
DBD::SQLite是DBI的数据库驱动程序,允许您将整个关系数据库保存在单个文件中。它功能强大,允许您使用许多针对其他数据库(如MySQL和Postgres)的持久性工具。
DBM::Deep是一个方便且功能强大的perl模块,可以高效检索和修改大型持久数据结构的一小部分。几乎与Storable一样易于使用,但在处理大型数据结构的一小部分时效率更高。
更新:我意识到我应该提到我已经使用了所有这些模块,并且根据您的特殊需求,它们中的任何一个都可能是“正确的选择”。
答案 1 :(得分:7)
您可能想尝试Tie::Storable。然后就像解决哈希一样简单。
如果您不想存储大量数据,并且可以在程序启动时一次性加载所有数据,那么可能就是这样。
如果你正在寻找更复杂但重量更轻的东西,很多人(包括我自己)都会发誓SQLite。
答案 2 :(得分:3)
如果我必须这样做,我可能会选择DBI和DBD :: SQLite,因为它不涉及将所有数据读入内存,但我只想提及其他一些方法,因为“还有更多不是一种方法“:
执行此操作的旧方法是使用DB_file
及其堂兄弟。它仍然适用于现代版本的Perl。缺点是它仅用于存储一维散列(其中没有任何引用的散列)。优点是你可以找到不花钱的好书,也可以找到在线文章,而且我相信它不涉及将整个文件读入内存。
另一种方法是将Data::Dumper
的内容打印到要存储的文件,并eval
文件的内容以读取数据。
另一件未被提及的事情是KiokuDB
,看起来像是基于Moose的尖端模块,如果你想要时髦的话。
答案 3 :(得分:2)
您是否希望透明地保留您的数据,即您不必担心在每次写入后执行commit() - 类型操作?我刚刚问了一个非常相似的问题:Simple, modern, robust, transparent persistence of data strutures for Perl,并列出了我找到的所有解决方案。
如果你想要透明持久性(autocommit),那么DBM::Deep可能比Storable更容易使用。以下是开箱即用的示例代码:
use DBM::Deep;
tie my %db, 'DBM::Deep', 'file.db';
if ( exists $db{foo}->{bar} ) {
print $db{foo}->{bar}, "\n"
} else {
$db{foo}->{bar} = 'baz';
}
答案 4 :(得分:1)
查看Tie::File
以及Tie::File::AsHash
或Tie::Handle::CSV
等子模块。全部采用CPAN,快速且易于使用。
答案 5 :(得分:0)
Storable允许您序列化任何Perl数据结构并将其读回。对于内存存储,只需使用IO :: Scalar存储到字符串中,这样您只需编写一次代码,对于写入磁盘,您只需传入另一个I / O句柄。