问题 从.net存储10到1亿个模拟输出的最佳方法(SQL与平面文件)


我一直致力于一个项目,该项目产生了大约10到1亿个输出的模拟量,我希望将其存储起来用于未来的分析。数据的组织有几种性质,例如:教室举办考试的学生,这些考试有一些不同的表现指标。

看起来我的数据是能够同时适应内存的边界线(假设模拟的计算需要内存中的大量数据来进行计算),但我没有任何迫切需要我的程序可以同时使用所有数据。

我正在考虑将计算值输出到SQL数据库或平面文本文件是否更好。我正在寻找关于哪种方法可能更快/更容易维护的建议(或者如果您有另外的建议来存储我对此开放的数据)。

我不需要能够与其他任何人共享数据,也不用担心几年后访问数据。我只是需要一种方便的方法来避免每次我想要对值的分析进行调整时重新生成模拟。


11933
2017-12-21 01:30


起源



答案:


我考虑使用数据库 - 没有某种分类方案的文件系统有1亿个文件太多,而数据库可以轻松处理这么多行。您可以将输出序列化为BLOB列,这样就不必映射它。另外,请考虑SQL Server 文件流访问 所以这可能实际上是一种混合方法,SQL为您管理文件。


4
2017-12-21 01:40





另外,听起来你最好将每次模拟运行的结果保存到一个平面文件中。它不一定是文本文件 - 它可以是二进制文件。

在运行一个或多个模拟之后,可以读取文件并将其放入数据仓库中以供以后分析。


3
2017-12-21 01:34



如果数据在.net对象中,二进制序列化可能会神奇地起作用。 - SWeko


答案:


我考虑使用数据库 - 没有某种分类方案的文件系统有1亿个文件太多,而数据库可以轻松处理这么多行。您可以将输出序列化为BLOB列,这样就不必映射它。另外,请考虑SQL Server 文件流访问 所以这可能实际上是一种混合方法,SQL为您管理文件。


4
2017-12-21 01:40





另外,听起来你最好将每次模拟运行的结果保存到一个平面文件中。它不一定是文本文件 - 它可以是二进制文件。

在运行一个或多个模拟之后,可以读取文件并将其放入数据仓库中以供以后分析。


3
2017-12-21 01:34



如果数据在.net对象中,二进制序列化可能会神奇地起作用。 - SWeko


将数据从RDBMS服务器加载到内存中的封装率约为每秒10K条记录。如果您有100M记录,并且您必须在某个时刻使用所有数据,那么您需要大约三个小时才能加载数据。那是在你做任何计算之前!

普通文件可以快几个数量级。使用基于文本的文件可以非常快速地完成任务;去二进制会以牺牲数据文件的可读性为代价来提高你的速度。


2
2017-12-21 01:46





看看MongoDB,其性能比SQL Server 2008快30倍-50倍。

http://blog.michaelckennedy.net/2010/04/29/mongodb-vs-sql-server-2008-performance-showdown/


2
2017-12-21 03:22



如果您想使用文件,MongoDB还支持文件。 - PmanAce