分层组织的二进制和文本文件的随机访问文件格式

Random Access File Format for hierarchically organised binary and text files

一个 Windows 桌面应用程序,我所在的开发团队使用遗留的 MFC CArchive 作为其应用程序文件格式,将文本文件和二进制文件序列化到磁盘和从磁盘序列化。该应用程序用于本地化这些 text/binary 文件中包含的字符串,并且 CArchive 封装了一个翻译 "project," 因此它生成为一个包含一个或多个这些子文件的整体文件。

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

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

我花了一些时间查看替代方案,最突出的是 ZIP/7Z 或 SQLite,因为 ZIP 已经内置了大部分文件 management/indexing 功能,而SQLite 是存储、检索和搜索字符串的理想选择,因此我认为这两种技术的某种组合可能是可行的方法。

据我所知,诀窍是组织或分区 SQLite 数据库,使其在增长时不会减慢速度,并且可以通过创建一个 table 每个文件或每个文件一个 DB,我不确定。

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

谢谢

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

如果您只想存储嵌入式文件,您可以将一堆 blob 放入 table(参见 sqlar 示例)。但是如果你想对那些文件的内部结构进行建模,你当然可以有更复杂的tables.

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

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.