gpt4 book ai didi

delphi - 如何将动态数据(未知数量的字段)存储到文件中?

转载 作者:行者123 更新时间:2023-12-03 15:03:21 25 4
gpt4 key购买 nike

我需要在文件中存储一些数据。目前每条记录(数据集)包含:

  • 字符串(可变长度),
  • 整数数组(可变长度),
  • 字节数组(可变长度),
  • 一些整数值。

将所有这些内容保存在二进制文件中一点也不困难。但是,我确信(不幸的是)我的数据格式会及时更改,并且我希望能够向每个“记录”添加更多字段。所以,显然我的文件格式无法修复。我认为最好的解决方案是将我的数据保存在(DB)表中,但我不想搞乱大佬(SQL、ADO、BDE、Nexus...)。我需要一个可以做到这一点的基本库(如果可能的话单个 PAS 文件)。由于这样做的目的是存储数据而不是处理数据,那么可以在没有数据库表的情况下完成吗?

该库的要求:

  • 它需要轻松支持超过 100 万行
  • 非常轻量
  • 如果可能,单个 PAS 文件
  • 强制:易于安装在新机器中(连同其编译的项目)
  • 强制:为了使用它,我不需要重新分发任何内容
  • 强制:用户无需安装/设置即可使用它
  • 可以是免费软件/共享软件
  • 它不必支持 SQL 查询或类似的高级功能
<小时/>

我用的是D7

最佳答案

看看our Synopse Big Table单位。

通过最近的升级,它可以完全满足您的需求。

以下是创建字段布局的方法:

var Table: TSynBigTableRecord;
FieldText, FieldInt: TSynTableFieldProperties;
begin
Table := TSynBigTableRecord.Create('FileName.ext','TableName');
FieldText := Table.AddField('text',tftWinAnsi,[tfoIndex]);
FieldInt := Table.AddField('Int',tftInt32,[tfoIndex,tfoUnique]);
Table.AddFieldUpdate;

要存储字节或整数数组,只需使用 tftWinAnsi 或更好的 tftBlobInternal 类型的字段(这是真正的可变长度字段),然后映射它与动态数组之间的转换,就像 RawByteString 一样。

您稍后可以安全地添加字段,系统将为您处理数据文件。

处理数据的方法有多种,但我实现了一种基于变体的使用记录的方法,并具有真正的后期绑定(bind):

var vari: Variant;

// initialize the variant
vari := Table.VariantVoid;
// create record content, and add it to the database
vari.text := 'Some text';
vari.int := 12345;
aID := Table.VariantAdd(vari);
if aID=0 then
ShowMessage('Error adding record');
// how to retrieve it
vari := Table.VariantGet(aID);
assert(vari.ID=aID);
assert(vari.INT=12345);
assert(vari.Text='Some text');

关于速度,you can't find anything faster IMHO 。在我的笔记本电脑上,使用一些文本和一个整数值创建 1,000,000 条记录,两个字段都使用索引,并且整数字段设置为唯一,不到 880 毫秒。它将使用很少的磁盘空间,因为所有存储都是可变长度编码的(类似于 Google 的 Protocol Buffers)。

它只需要两个单元,适用于 Delphi 6 到 XE(并且已经支持 Unicode,因此您可以在需要时安全地升级到较新的 Delphi 版本)。无需安装,并且只向可执行文件中添加了几 KB。它只是一个用纯 Delphi 编写的小而强大的 NoSQL 引擎,但具有数据库使用的强大功能(即纯字段布局)和内存引擎的速度,并且大小没有限制。

它是完全开源的,具有许可。

请注意,我们还提供 SQLite3 wrapper ,但这是另一个项目。速度较慢但功能更强大,具有 SQL 支持和集成的客户端/服务器 ORM。

关于delphi - 如何将动态数据(未知数量的字段)存储到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com