我正在寻找一些关于如何在一个有趣的数据存储问题中保持二进制文件和SQL数据库的某些好处的输入。
我有一种传统的自定义二进制文件格式,实质上是几百个多维数组,它们在C中被序列化为一个带有fwrite()'s‘的文件,每个文件都是一个固定大小的文件(~5MB未压缩),为了便于讨论,表示了一个“模型系统”。每个建模系统都有自己的文件。所以遗留系统只是一堆5MB文件。
我们需要以两种非常不同的方式(二进制和SQL)访问这些数据。
一种使用场景就像一个带有SQL后端的传统业务应用程序,用户需要将某些值作为web应用程序的一部分进行检索和显示(以及一些更新)。从数据的表格结构来看,它有一条通向转换为标准SQL数据库的明显路径。
但是,有时我们需要将几乎整个5MB的“建模系统”加载到内存中,并执行一些使用大多数值的复杂迭代计算,并更新建模系统中的某些其他值。我们不能访问循环中的数据库进行计算--它太慢了。在这里,需要针对SQL运行--二进制文件中快速的fread()是完美的。它将所有数据放入数组中,为复杂的计算做好准备,结果可以很容易地序列化回fwrite()文件。
还有几点是相关的:首先,我们在一个建模的系统上只做了10次计算。从那时起,该系统实际上是只读的,并最终被删除。“建模系统”不会相互交互,用户一次只在一个系统上工作。因此,我们的数据结构在每个“建模系统”的基础上是高度隔离的,实际上是一个由结构相同的数据库组成的数据库。此外,我们也不需要庞大的规模。在30以下的建模系统是所有将是有效的一次。
一些想法:
一定有更好的办法。
谢谢!
编辑:我们一直沿着C#/SQL/EntityFramework路线寻找一小部分数据,从数据库中获取数据的速度惊人地慢。(许多秒只是用于小子集。)记住,我们有数百个多维数组,它们横切了一个web应用程序想要的自然但非常深的OO模型。填充了OO模型后,我们将不得不重新编码计算部分。
到目前为止,这些回复和评论帮助暴露了将代码模型与存储本身分开考虑的必要性。现在的问题是如何使这种传输(a)快速,(b)明智地更新值和(c)合理的编码任务。似乎每个人都认为关系(SQL)存储是可行的。
那么,如何在SQL fast(er)中获取数据呢?数百个数组中的大多数是3-5维(问题空间中的10维),相当于外键。这将为这些键的每个唯一组合设置一个SQL表,并根据需要为值设置尽可能多的字段。我没有被锁在MS堆栈上。
我尽量不做任何进一步的范围调查。谢谢!
发布于 2016-06-03 07:29:37
将数据放入数据库中。
编写一个函数,从数据库中提取所有数据并填充数组。
将填充的数组传递给未更改的calc函数。
使用calc函数的结果数组编写一个函数来编写数据库。
发布于 2016-06-03 09:25:16
如今,5Mb的数据量似乎微不足道。因此,我不会担心按需退出,反序列化和操纵它。考虑到数据的数量,性能不应该是一个问题。
如果这些数据没有预计的格式更改,我将坚持这种方法。
https://softwareengineering.stackexchange.com/questions/320165
复制相似问题