寻找有关在本地磁盘上存储数据的想法

我有大量的数据存储在一个XML文件中,173 MB(460万行),我存储在我的Windows窗体应用程序的工作目录中。 它是将数据表写入XML文件的结果。 数据表最初是从查询填充到SQL服务器。

我将其存储在本地而不是从服务器请求它的原因是数据请求耗时超过40秒并且有时超时并且数据是静态的并且永远不会改变,而且用户可以离线并且仍然使用数据。

将文件加载回数据表需要20-30秒。 我不太担心从磁盘加载所花费的时间,因为我让用户知道数据正在加载并且耐心等待。 但是,我不喜欢XML文件格式,我正在寻找其他磁盘存储的想法。

数据表仅用作集合对象的最终填充的中间人。 如果你有吸烟我想听听他们。

我希望远离数据库解决方案,并倾向于二进制文件方法。 下面是我的第一次尝试,但我得到一个内存不足exception:

byte[] b = null; using (MemoryStream stream = new MemoryStream()) { BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, timeData); b = stream.ToArray(); } using (FileStream fileStream = new FileStream("brad.bin", FileMode.Create, FileAccess.Write)) { fileStream.Write(b, 0, b.Length); } 

我会看一个紧凑的(本地)数据库,如SQL Server CE或SQLite 。 数据库就是为此而设计的。

SQLite非常好 ,您可以从各种断开连接的数据库解决方案中进行选择,但这实际上取决于您要将其放入其中的工作以及您拥有的数据集。

例如,您可以尝试使用SQLite或csv-file。

如果它永远不会改变,为什么不首先提供应用程序安装?

您是否对“永远不会改变”的含义实际意味着什么感到困惑?

至于本地存储解决方案,有很多可供选择,比如SQLite ,它可以让你使用数据库解决方案,即使在本地,也没有任何安装麻烦。

如果您使用数据表作为中间人,然后从那里加载到集合中,那么使用XMLSerialize直接加载到您的集合中呢? 跳过中间人应该会给你一些性能提升。

为什么应用程序每次都要求整个数据集? 如果你正在使用数据库,你应该(imho)对待数据库与你的堆类似…
– 根据需要申请所需物品

某些操作可能需要比较整个数据库中的不同数据,但这就是SQL的用途。 在数据库中执行这些操作,而不是在应用程序中执行。

您是否有一个用例场景,您绝对需要内存中的整个数据集?

我也不喜欢XML,但我认为如果数据完全是只读的话就是这样。

我认为您可以将标准XML文本格式的XML文本写入磁盘,尽管您在名称中使用了带有Binary的类。 打开它,看看。 (使用dd Unix工具(如果你还没有dd,请下载一些Unix工具)来获取前几兆字节的示例文件,在Wordpad中打开它或者类似,然后看看。)

如果您想让它不易人类阅读,请考虑使用加密。

编辑

那就是如果你的工作站非常专注于任务并在RAM中保留173MB的数据,并且从中工作而不是摆弄SQL恰好具有商业意义。

为什么不将数据保留在服务器上并使用一些标准的DataSet缓存? 创建返回180Mb数据的查询听起来像设计问题。

我认为对历史趋势更合适的解决方案是仅检索当前显示的那些记录。 如果要放大图表的某个部分,请仅检索放大的数据。

关于二进制序列化,您应该直接序列化到FileStream

 using (FileStream fileStream = new FileStream("brad.bin", FileMode.Create, FileAccess.Write)) { new BinaryFormatter().Serialize(fileStream, timeData); } 

首先……这是一个难看的段落:P

关于你的问题,如果你使用.NET,为什么不使用SQL Server Compact (mdf文件)? 这就像使用SQL Server一样,但数据存储在一个文件中。

我个人认为这是最好的方式,但如果你想要选择那么我想你可以考虑一下

  • Excel文件
  • 逗号分隔的文本文件
  • MS Access数据库