存储数据的最佳(免费)方式?文件系统的更新怎么样?

2023-12-29

我有一个关于如何解决这个问题的想法,但我想知道是否有更简单、更可扩展的方法来解决我的问题。

我正在开发的程序有两种基本形式的数据:图像以及与这些图像相关的信息。与图像相关的信息之前已存储在极其简单的 JET 数据库(四个表)中,结果证明该数据库速度缓慢且存储字段不完整。我们正在转向新的数据存储实现。考虑到所涉及的数据结构的简单性,我认为数据库是多余的。

每个图像都有自己的信息(捕获参数),将是一组相互关联的图像的一部分(例如在同一个三十分钟内拍摄的图像),然后是一个更大的图像组的一部分(拍摄同一个人) )。现在,我将人员存储在具有唯一标识符的字典中。然后每个人都有一个不同组图片的列表,每个图片组都有一个图片列表。所有这些类都是可序列化的,我只是序列化和反序列化字典。相当简单的事情。图像是单独存储的,因此字典的大小不会变得天文数字。

问题是:当我需要添加新的信息字段时会发生什么?是否有一种简单的方法来设置这些数据结构以考虑未来潜在的修订?过去,我在 C 中处理此问题的方法是创建一个包含大量空字节(至少有 k 个)的可序列化结构,以实现未来的可扩展性,结构中的一个字节表示版本。然后,当程序读取该结构时,它会根据大量 switch 语句知道要使用哪种反序列化(旧版本可以读取新数据,因为无关的数据只会进入被忽略的字段)。

C#中是否存在这样的方案?就像,如果我有一个由一组 String 和 Int 对象组成的类,然后我将另一个 String 对象添加到该结构中,如何从磁盘反序列化一个对象,然后将字符串添加到其中?我是否需要接受拥有多个版本的数据类以及一个采用反序列化流并根据基类中存储的某些版本信息处理反序列化的工厂?或者像 Dictionary 这样的类是存储此类信息的理想选择,因为它会自动反序列化磁盘上的所有字段,并且如果添加了新字段,我可以捕获异常并用空白字符串和整数替换这些值?

如果我采用字典方法,是否会影响文件读/写以及参数检索时间?我认为,如果类中只有字段,那么字段检索是即时的,但在字典中,会产生一些与该类相关的小开销。

Thanks!


Sqlite http://www.sqlite.org/就是你想要的。它是一个快速、可嵌入的单文件数据库,可以绑定到大多数语言。

关于可扩展性,您可以使用默认属性存储模型,然后为属性扩展创建一个单独的表以供将来更改。

一两年后,如果代码仍在使用,您会很高兴:1)其他开发人员不必学习定制的代码结构来维护代码,2)您可以导出、查看、修改使用标准数据库工具(有一个用于 sqlite 文件的 ODBC 驱动程序和各种查询工具)来处理数据,3)您将能够以最少的代码更改扩展到数据库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存储数据的最佳(免费)方式?文件系统的更新怎么样? 的相关文章

  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐