在我的应用程序中,我想使用文件来存储数据。我不想使用数据库或明文文件,目标是保存双精度和整数值随着字符串只是为了识别记录的名称;我只需要将数据保存在磁盘上以生成报告。文件甚至可以增长到gb。你建议使用什么格式?二进制?如果是的话,你知道哪个vcl组件/库是好的?我的目标是创建一个应用程序来创建和更新文件,而另一个工具将"吃掉"这些文件根据需要为用户生成漂亮的PDF报告。你觉得呢?有什么想法或建议吗?
提前感谢。
如果您不想重新发明轮子,您可以从我们这边找到您任务所需的所有开源工具:
- Synopse大表存储大量数据-特别是
TSynBigTableRecord
类存储无限数量的记录与字段,包括索引,如果需要的话-它肯定会比任何其他常规SQL DB更快,使用更少的磁盘大小 - synpse SQLite3框架,如果你宁愿使用标准的SQLite引擎存储-它带有一个完整的客户端/服务器ORM
- 代码报告,包括pdf文件生成
完整的源代码,从Delphi 6到XE。
我刚刚更新了框架的文档。超过600页,详细介绍了每个类方法,以及新的增强的一般介绍。参见SAD文档
Update:如果您计划使用SQLite,您应该首先猜测如何存储数据,要创建哪些索引,以及SQL查询如何加快您的请求。为每个请求读取所有文件内容不是一个好主意:您应该更好地组织数据,以便单个SQL查询能够返回扩展后的结果。有时,对数据使用附加值(如临时总和或平均值)是个好主意。还可以考虑使用SQLite3的RTree虚拟表,它专门用于加速对double
min/max多维数据的访问:它可能会大大加快您的请求。
您不想使用完整的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()方法用于将"消费"数据的程序。这样,您仍然可以在不连接到任何外部数据库的情况下创建索引记录,同时将交换数据保存在单个文件中。
- 定义与平面文件一起工作的API,以便API可以通过多种方式由单独的数据层实现。
- 使用标准的嵌入式SQL数据库(不包括SQLite或Firebird)实现API。
- 只有当标准解决方案有问题时,才考虑自己的解决方案。
我使用KBMMemtable -参见http://www.components4developers.com/-快速,可靠,已经存在很长时间了-支持二进制和CSV流进出文件,以及索引,过滤器和许多其他好东西- TClientDataSet将不适用于大型数据集。