2011-02-23 91 views
4

我必须从数据库中提取150K记录。我正在使用da.Fill(ds,"Query")及其投掷system.outofmemoryexceptionsystem.outofmemoryexception填充DataAdapter时?

Dim daGrid As New SqlDataAdapter(sqlcmd_q) 
daGrid.Fill(dsGrid, "Query") 
daGrid.Dispose() 

我只需要这个数据表。我无法使用XML。因为我需要将此分配给MSChartControl以显示ScotterPlot。

有什么建议吗?

+2

购买更多内存;) – w69rdy 2011-02-23 14:58:27

+0

以合理的方式聚合数据... – 2011-02-23 15:01:12

+0

这些记录有多大(以字节为单位)? – 2011-02-23 15:01:31

回答

7

我要检查的第一件事是你要返回多少列以及它们的数据类型是什么。虽然150K记录很多,但除非每条记录的长度大约为13K(在32位计算机上),否则它不应该给你一个OOM异常。这表明你要么返回比你需要的更多的字段,要么可能某些字段是非常大的字符串或二进制数据。尝试减少select语句以仅返回显示器绝对需要的字段。

如果这不起作用,您可能需要从DataTable移动到自定义数据类型的列表(具有相应字段的类)。

+0

我觉得有点奇怪。在我的情况下,我有一台64位的128GB内存和1.8T磁盘机器。该表有300万行,大约800MB。总是有OOM。但是,这在另一台内存较少(64GB)的机器中不会发生。我不知道这是怎么回事。 – machinarium 2015-03-26 03:01:01

+0

'或者可能某些字段是非常大的字符串或二进制数据'假设您有100列全部定义为'VARCHAR(MAX)',但没有值超过10个字符。与DB列是否都是'VARCHAR(10)'有区别吗?我会假设没有。只有单元格中的实际值“非常大”,对吗? – sab669 2017-06-02 13:51:27

+0

@ sab669正确 - 客户端上varchar(max)的内存利用率应该(或多或少)实际数据长度,而不是列的大小。 – 2017-06-02 14:41:21

4

您没有指定查询。确保它只包含你需要的列。

如果仍然存在问题,可以尝试切换到64位(如果您的硬件支持它并且有超过2 GB的可用内存)。

如果这不能帮助您减少内存占用。一个可能的选择是绘制绘图而不将所有基础数​​据存储在内存中。只需逐个加载数据,计算坐标并存储这些数据而不存储底层记录。也许你甚至可以让查询做到这一点。