【问题标题】:Got an out of memory error while loading data into datatable c#将数据加载到数据表 c# 时出现内存不足错误
【发布时间】:2020-01-30 20:00:56
【问题描述】:

我有库存 ohlc 数据,总记录数为 400 万条记录,但是当我从数据适配器将数据加载到数据表中时,它会给我一个内存不足的错误。

查询

SELECT company_id,trading_Date,trading_open,trading_high, trading_low,trading_close,trading_vol 
FROM company_trading1sIntl 
WHERE company_id = 'YM' 
ORDER BY trading_Date 

功能

public DataTable FillDT(string query, SqlConnection conn)
{
    SqlCommand sqlcmd = new SqlCommand(query,conn);
    SqlDataAdapter sqlda = new SqlDataAdapter(sqlcmd);
    DataTable dt = new DataTable();

    try
    {
        sqlda.Fill(dt);
        if (dt.Rows.Count > 0)
        {
            return dt;
        }
        else
        {                   
            return null;
        }
    }
    catch(Exception ex)
    {
        return null;
    }        
} 

【问题讨论】:

  • 400 万条记录很多..
  • 尝试运行查询,将行数限制为 TOP 100000,然后按自己的方式达到 400 万行以检查您的限制
  • 您正在尝试将 4 m 行数据加载到内存中?这很可能是您出现内存不足异常的原因。这意味着程序不能分配比您尝试使用更多的内存。如果每行有 1 kb 的内存 - 你需要大约 1kb * 4000000 = 4 GB 的内存来存储每一行​​。这可能太多了。您可以打开 Windows 任务管理器并在性能选项卡下检查您的内存使用情况。我认为您不应该尝试一次加载 400 万条记录。而是尝试在 SQL 中执行的任何操作,因为数据库服务器旨在处理此类数字。
  • 如果您只是展示您的数据,请尝试使用 where 删除不相关的行,或使用 cmets 中建议的 TOP(数量)来限制行数。

标签: c# database datatable stock dataadapter


【解决方案1】:

您需要问自己的第一个答案是,为什么要将所有记录加载到数据表中? 做一个SqlDataReader 来读取数据,编辑它,然后每个(例如)100.000 行做一个SqlBulkCopy 来将它们重新插入到你的表中,比adapter.Fill() 更快,也许你可以避免存储内存中的所有 4.000.000 条记录。

如果您需要在一个“选择”中处理所有数据,您就没有机会编辑您的 web.Config,如下所示:

<runtime>
    <gcAllowVeryLargeObjects enabled="true" />    
</runtime>

并编译一个 x64 二进制文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2022-08-16
    • 2018-08-24
    • 2015-08-07
    相关资源
    最近更新 更多