Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一次加载所有datatable时引发System.OutOfMemoryException_C#_Sql Server_Database_Dataset_Out Of Memory - Fatal编程技术网

C# 一次加载所有datatable时引发System.OutOfMemoryException

C# 一次加载所有datatable时引发System.OutOfMemoryException,c#,sql-server,database,dataset,out-of-memory,C#,Sql Server,Database,Dataset,Out Of Memory,我正在使用一个表中有将近800万条记录的数据库。我知道这是巨大的数据,不应该一次加载所有数据。但是,对于我的项目来说,将所有这些记录加载到驻留在内存中的数据集是很重要的 当我尝试使用以下代码在dataset中填充datatable时: Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); foreach (Component component in EnumerateComponent

我正在使用一个表中有将近800万条记录的数据库。我知道这是巨大的数据,不应该一次加载所有数据。但是,对于我的项目来说,将所有这些记录加载到驻留在内存中的数据集是很重要的

当我尝试使用以下代码在dataset中填充datatable时:

Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            foreach (Component component in EnumerateComponents())
            {
                string name = component.GetType().Name;
                if (name.Contains("baghadadpTableAdapter"))
                {
                    string TableName = name.Substring(0, name.IndexOf("TableAdapter"));
                   baghadadpTableAdapter1.Fill(ds1.persons);
                }
            }
            stopwatch.Stop();
            TimeSpan time = stopwatch.Elapsed;
BaghadpTableAdapter1.Fillds1.persons行中出现以下错误:

System.OutOfMemoryException: 'Exception of type 'System.OutOfMemoryException' was thrown.'
如何解决此问题,同时将所有这些海量数据加载到ds1中的datatable persons中,您可以:

增加机器上的内存, 仅加载相关列。 但最终,您需要考虑如何将记录分块处理。我不知道您的应用程序是如何工作的,但我还没有遇到应用程序需要超快速访问800万个对象的情况

众所周知,DataTable不适合大型集合。我见过一些表使用的内存是原始数据的6-7倍


如果您真的需要在内存中存储大量数据,那么考虑将其更改为域对象列表,而不是DATABATE。但我也质疑在内存中存储数百万条或记录的必要性

我只需要分页数据集。您可以研究几种不同的方法来实现这一点。

是否有理由将所有这些都存储在内存中?您不能使用分页吗?但是,对于我的项目来说,将所有这些记录加载到驻留在内存中的数据集是很重要的。您能解释一下原因吗?将这些数据存储在内存中的原因是,用户希望从服务器加载这些数据,然后断开与服务器的连接,并将其脱机导航。在第一次会议上,我向他解释了这个问题可能会发生,但他坚持要找到实现这一点的方法,所以我告诉他我会尽全力解决这个问题,这就是为什么我请你们帮忙的原因。@tymtam所以你们说,如果我加载一个特定的字段,可能会降低内存的负载,并且数据云可能会一次上载所有这些字段,你们是这么说的吗?你们能解释一下域列表是什么意思吗?域对象列表。例如,不填写员工数据表,而是创建一个列表,并用该数据中的员工对象填充该列表。之所以将这些数据存储在内存中,是因为用户希望从服务器加载这些数据,然后断开与服务器的连接,并将其脱机导航。在第一次会议上,我向他解释了这个问题可能会发生,但他坚持要找到实现这一点的方法,所以我告诉他我会尽最大努力解决这个问题,这就是为什么我请你们帮忙解决这个问题。你需要确保你要加载的机器有足够的内存。您可以尝试将数据复制到硬盘并从硬盘分页。好主意,我将尝试加载数据并将其保存在本地数据库或文件中,然后导航它们。一旦这个想法对我起作用,我会尽快给出答案。