【问题标题】:Random Access File Format for hierarchically organised binary and text files分层组织的二进制和文本文件的随机访问文件格式
【发布时间】:2017-08-20 07:18:53
【问题描述】:

一个 Windows 桌面应用程序,我所在的开发团队使用旧版 MFC CArchive 作为其应用程序文件格式,将文本文件和二进制文件序列化到磁盘和从磁盘中读取。该应用程序用于本地化这些文本/二进制文件中包含的字符串,而 CArchive 封装了一个翻译“项目”,因此它被生成为一个包含一个或多个这些子文件的整体文件。

这种文件格式在很多方面都显示了它的时代,我们正在寻求改变为更现代的东西。我们主要担心的是它速度慢并且占用大量内存;这不是随机访问,因此访问存档中的任意文件甚至只是生成目录列表都需要将整个内容加载到内存中,因此操作存档的空间和时间消耗取决于其大小,并且不可行存档的就地更新。

最后,扩展格式是痛苦的,因为它涉及到我们在代码中乱扔条件语句,这些条件语句根据存档的版本标记的值将某些字段(或不)序列化到存档或从存档序列化。

我花了一些时间寻找替代方案,其中最突出的是 ZIP/7Z 或 SQLite,因为 ZIP 已经内置了大部分文件管理/索引功能,而 SQLite 将是理想的字符串的存储、检索和搜索,所以我认为这两种技术的某种组合可能是要走的路。

据我所知,诀窍是组织或分区 SQLite DB,使其在增长时不会变慢,并且可以将搜索限制在单个文件中,或者通过为每个文件创建一个表或者每个文件一个数据库,我不确定。

有没有其他人尝试过这样的事情,如果有,有什么建议吗?

谢谢

【问题讨论】:

  • 老实说,单个 SQLite 文件应该可以正常工作。您的“子文件”可以是单个表,也可以是单个表的某些列(正确索引)。

标签: c++ windows sqlite mfc carchive


【解决方案1】:

作为基于文件的数据库,SQLite 可用于implement an application file format

如果您只想存储嵌入文件,您可以将一堆 blob 放入一个表中(参见sqlar 示例)。但如果你想对这些文件的内部结构建模,当然可以有更复杂的表。

要将搜索限制在文件中,您只需要存储一些东西来识别文件:

CREATE TABLE Strings (
    StringID  INTEGER PRIMARY KEY,
    FileID    REFERENCES FileTable(FileID),
    Value     TEXT,
    [...]
);

这样您就可以限制您的查询:

SELECT * FROM Strings WHERE Value = 'hello' AND FileID = 42;

如果您不想搜索整个字符串而是搜索其中的单词,请考虑使用full-text search extension

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 2018-12-06
    • 2011-08-27
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多