在我的应用程序中,我想使用文件来存储数据。我不想使用数据库或明文文件,目标是保存双精度值和整数值以及字符串,以识别记录的名称;我只需要在磁盘上保存数据以生成报告。文件甚至可以增长到千兆字节。您建议使用什么格式?二进制?如果是这样,您知道哪个 vcl 组件/库好用?我的目标是创建一个创建和更新文件的应用程序,而另一个工具将“吃掉”这些文件,为用户按需生成漂亮的 pdf 报告。你怎么看?有什么想法或建议吗?
提前致谢。
如果您不想重新发明轮子,您可以从我们这边找到所有需要的开源工具来完成您的任务:
TSynBigTableRecord
用于存储无限数量的带有字段的记录的类,如果需要,包括索引 - 它肯定会比任何其他常规 SQL DB 更快并且使用更少的磁盘大小使用完整的源代码,从 Delphi 6 到 XE。
我刚刚更新了框架的文档。超过 600 页,包含每个类方法的详细信息,以及新增强的一般介绍。请参阅 SAD 文档。
更新:如果您打算使用 SQLite,您应该首先猜测数据将如何存储,要创建哪些索引,以及 SQL 查询如何加快您的请求。读取每个请求的所有文件内容是一个坏主意:您应该更好地构建数据,以便单个 SQL 查询能够返回已花费的结果。有时,对数据使用附加值(如临时总和或平均值)是个好主意。还可以考虑使用SQLite3 的 RTree 虚拟表,该表专用于加速对double
最小/最大多维数据的访问:它可能会大大加快您的请求。
您不想使用完整的 SQL 数据库,并且认为纯文本文件过于简单。
介于两者之间的点包括:
不是完整的 SQL 数据库,而是更多的键值存储,从技术上讲不是平面文件,但它确实提供了一个“键+值”列表,可以在单个主键上快速搜索。比如BSDDB。它的名称中有字母 D 和 B。在您看来,这是否使它成为一个数据库?因为它不是关系数据库,也不做 SQL。它只是一种二进制键值(哈希表)blob 存储机制,使用一种易于理解的二进制文件格式。就个人而言,我不会开始一个新项目并使用该类别中的任何东西。
推荐:使用 SQL 但不如独立 SQL 数据库服务器大的东西。例如,您可以使用 SQLite 和delphi 包装器。它经过了很好的测试,并在许多 C/C++ 和 Delphi 应用程序中使用,并且比你自己可以滚动的任何东西都更值得信赖。它是一个非常轻量级的嵌入式数据库,受到许多人的信任。
推出您自己的 ISAM 或 VLIR,它最终会随着时间的推移演变成您自己的内部 DBMS。涉及多个文件,并且有索引,因此您可以快速查找数据,而无需将所有内容加载到内存中。不建议。
最扁平的二进制固定记录长度文件。你最初在你的问题中提到,power basic 有一个叫做随机访问文件的东西,然后你从你的问题中删除了它。可能是您正在寻找的东西,尤其是作为主要操作的仅追加写入。滚动您自己的 TurboPascal 时代的“记录文件”。如果使用“FILE OF RECORD”类型,则会达到 2gb 的限制,并且 Unicode 存在问题。所以使用 TStream 代替,像这样. 二进制文件格式对它们有很多影响,特别是因为随着时间的推移很难增长和扩展二进制文件格式,而不会破坏您读取旧文件的能力。这就是为什么我建议您从一开始可能看起来有点过分杀伤力 (SQLite) 而不是推出自己的二进制解决方案的关键原因。
(更新 2:在更新问题以提及 PDF 以及听起来像是报告系统要求的内容后,我认为您确实应该使用真正的数据库,但也许是一个小型且易于使用的数据库,例如 firebird 或 interbase。)
我建议使用TClientDataSet ,并通过生成程序使用它的SaveToFile() / SaveToStream()方法,并为将“消耗”数据的程序使用LoadFromFile() / LoadFromStream()方法。这样,您仍然可以在不连接到任何外部数据库的情况下创建索引记录,同时将交换数据保存在单个文件中。
我使用 KBMMemtable - 请参阅http://www.components4developers.com/ - 快速、可靠、存在很长时间 - 支持二进制和 CSV 流进出文件,以及索引、过滤器和许多其他好东西 - TClientDataSet不会很好地处理大型数据集。