假设我在MSSQL数据库中有几个表,每个表大约有5-10个属性。表之间有一些简单的关联,但每个表都有500,000到1,000,000行。
有一个算法对这些数据(所有数据)运行,所以在运行算法之前,我必须从数据库中检索所有数据。算法不会改变数据,只是读取数据,所以我只需要检索数据。
我正在使用LINQ to SQL。检索所有数据大约需要两分钟。我想知道的是,序列化到文件,然后反序列化(在需要的时候)是否真的会更快地加载数据。
数据大约200MB,我不介意将其保存到磁盘。那么,如果对象是从文件反序列化的,还是使用LINQ2SQL DataContext反序列化的,速度会更快吗?
有这方面的经验吗?
发布于 2009-04-28 13:00:59
我认为LINQtoSQL可能不是这类应用程序的最佳选择。当您谈到这么多对象时,您会产生相当多的创建对象实例(持久化类)的开销。
我会选择一种解决方案,存储过程通过ADO.NET仅检索必要的数据,应用程序将其存储在内存中(内存现在很便宜,200MB应该不是问题),分析算法对内存中的数据运行。
我不认为你应该把数据存储在文件里。最后,您的数据库也只是一个或多个由数据库引擎读取的文件。所以你要么
据我所知,后一种选择涉及大量开销,没有任何优势。
编辑:如果您的数据很少更改,您可以考虑在分析和缓存预处理数据之前对数据进行预处理(在数据库或文件系统中)。这只有在预处理数据的分析速度比原始数据快(很多)的情况下才有意义。也许一些预处理可以在数据库本身中完成。
发布于 2009-04-28 12:51:32
您应该尝试在不使用LINQ to SQL层的情况下直接使用ADO.NET,即使用SqlDataReader
读取数据。
如果您按顺序处理数据,则可以在需要时从读取器获取记录,而不必先将它们全部读取到内存中。
发布于 2009-04-28 13:03:34
如果您有一个对数据库中的大多数数据进行操作的进程...那么这听起来就像是存储过程的作业。它不会是面向对象的,但它会快得多,也不会那么脆弱。
https://stackoverflow.com/questions/797662
复制相似问题