【问题标题】:System.OutOfMemoryException unresolved after increasing max server memory增加最大服务器内存后未解决 System.OutOfMemoryException
【发布时间】:2017-03-08 00:09:20
【问题描述】:

我是新手,所以请多多包涵。

之前我尝试使用批量插入导入一个非常大的 CSV 文件,而没有任何批量大小、千字节每批次或行每批次参数。然后我遇到了以下错误:

执行批处理时出错。错误消息是:引发了“System.OutOfMemoryException”类型的异常。

我通过拆分 CSV 并将其分块导入来解决此问题。结果,我最终在 SQL 2016 Server Management Studio 中有两个单独的表。这两个表包含已拆分的 CSV 值。因此,它们具有相同的列、列大小和数据类型。我决定使用联合所有查询来组合它们。当我这样做时,错误又回来了。然后我决定将最大服务器内存增加到 5 GB,我认为这应该绰绰有余。但是,当我重试联合所有查询时,无论如何,错误又回来了。我的电脑总共有 8 GB 的 RAM。我正在使用 Windows 10 64 位和基于 x64 的处理器。

表格的属性如下所示:

CREATE TABLE [dbo].[indivs16] (
    [Cycle] [char] (4) NOT NULL,
    [FECTransID] [char] (19) NOT NULL,
    [ContribID] [char] (12) NULL,
    [Contrib] [varchar] (50) NULL,
    [RecipID] [char] (9) NULL,
    [Orgname] [varchar] (50) NULL,
    [UltOrg] [varchar] (50) NULL,
    [RealCode] [char] (5) NULL,
    [Date] [datetime] NULL,
    [Amount] [int] NULL,
    [Street] [char] (3) NULL,
    [City] [varchar] (30) NULL,
    [State] [char] (2) NULL,
    [Zip] [char] (5) NULL,
    [Recipcode] [char] (2) NULL,
    [Type] [char] (3) NULL,
    [CmteID] [char] (9) NULL,
    [OtherID] [char] (9) NULL,
    [Gender] [char] (1) NULL,
    [Microfilm] [varchar] (18) NULL,
    [Occupation] [varchar] (38) NULL,
    [Employer] [varchar] (38) NULL,
    [Source] [char] (5) NULL
) ON [PRIMARY]

这是我为联合运行的查询:

SELECT * FROM Indivs16000
UNION ALL
SELECT * FROM Indivs16001

这是我如何进行查询的屏幕截图:

【问题讨论】:

  • 首先,您的数据库有自己的内存设置,如果您将更多内存插入服务器,这些设置不会改变。其次,您应该能够将 CSV 批量导入到同一个表中。这是大文件的首选方法。
  • @Ashalynd 我也尝试将批次导入到同一个表中。但是,在将一定数量的批次导入同一个表后,错误会再次出现。
  • 你是怎么做到的?该文件的大小是多少,批处理大小是多少?你的数据库设置是什么?另外,表结构是什么,是否定义了任何索引?
  • 一种简单的方法是编写一个python(perl,或任何你可以使用的语言)脚本,它将行从一个表复制到另一个表中。或者从原始文件中读取行并使用该脚本写入表中。很可能,有人已经写过类似的了:)
  • 原始文件的大小为 3.67 GB。其中三个批量大小为 1 GB。其余三个分别为 0.37 GB、0.37 GB 和 0.09 GB。我不知道你说的数据库设置是什么意思。我将发布表结构是什么。我不知道索引是什么。

标签: sql sql-server memory memory-management out-of-memory


【解决方案1】:

如果您使用了导入/导出实用程序,那将非常简单,即使使用批量插入,您也可以使用批处理并插入到同一个表中。但是,它不是世界末日,您可以再试一次。

【讨论】:

  • 我认为你不明白这个问题。进口没问题。问题是由于内存错误,现在我无法处理数据库中的大表。
  • 我确实理解这个问题,这就是为什么建议导入到一个表中,您仍然可以将这两个表合并。我确信要求不是一次性读取大量数据。
【解决方案2】:

该错误看起来像是 .NET 错误,而不是 SQL Server 错误。

你是怎么查询的?如果您使用System.Data.DataTable 进行查询,则客户端的内存不足,因为它将全部加载到内存中。

您应该改用IDataReader 来查询数据,这将通过数据“firehose”样式流式传输,您一次读取单向数据记录,因此您只有几千条记录提取到客户端一次内存 - 无论您的表有多大或您的 SELECT 语句返回多少条记录。

【讨论】:

  • 感谢您的回复。我是新手,所以我可能很难跟随你。我不确定您所说的“您如何查询?”是什么意思。希望它能回答您的问题,我将添加我查询位置的屏幕截图。我不知道 IDataReader 是什么,但它可能是我的问题的解决方案。你能告诉我如何使用 IDataReader 进行查询,或者给我一个链接来向初学者解释吗?在此期间,我将查找有关它的信息。我希望使用 IDataReader 进行查询与我通常的做法没有什么不同。
  • 看来我需要一个名为 Microsoft Visual Studio 的程序来执行此操作。我没有那个,使用它看起来非常复杂。是否有使用 IDataReader 的替代方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2014-12-11
  • 2013-01-15
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多