System.OutOfMemoryException 增加最大服务器内存后未解决
System.OutOfMemoryException unresolved after increasing max server memory
我是新手,所以请多多包涵。
早些时候,我尝试使用没有任何批量大小、kilobytes_per_batch 或 row_per_batch 参数的批量插入来导入一个非常大的 CSV 文件。然后我遇到了以下错误:
执行批处理时出错。错误消息是:抛出 'System.OutOfMemoryException' 类型的异常。
我通过拆分 CSV 并将其分块导入解决了这个问题。结果,我最终在 SQL 2016 Server Management Studio 中有两个单独的 table。这两个 table 包含来自已拆分的 CSV 的值。因此,它们具有相同的列、列大小和数据类型。我决定使用 union all 查询来组合它们。当我这样做时,错误又回来了。然后我决定将最大服务器内存增加到 5 GB,我认为这应该绰绰有余。但是,当我重试 union all 查询时,错误又回来了。我的电脑总共有 8 GB 的 RAM。我正在使用 windows 10 64 位和基于 x64 的处理器。
table 的属性如下所示:
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
这是我如何进行查询的屏幕截图:
该错误看起来像 .NET 错误,而不是 SQL 服务器错误。
你是怎么查询的?如果您使用 System.Data.DataTable
进行查询,那么您 运行 客户端内存不足,因为它正在将其全部加载到内存中。
您应该改为使用 IDataReader
查询数据,这将流式传输数据 "firehose" 样式,您一次可以单向读取数据记录,因此您只有一个一次将几千条记录提取到客户端内存中——无论您的 table 有多大或您的 SELECT
语句返回多少条记录。
如果您使用了 import/export 实用程序,那将非常简单,即使使用批量插入,您也可以使用批处理并插入到相同的 table。然而,这不是世界末日,您可以再试一次。
我是新手,所以请多多包涵。
早些时候,我尝试使用没有任何批量大小、kilobytes_per_batch 或 row_per_batch 参数的批量插入来导入一个非常大的 CSV 文件。然后我遇到了以下错误:
执行批处理时出错。错误消息是:抛出 'System.OutOfMemoryException' 类型的异常。
我通过拆分 CSV 并将其分块导入解决了这个问题。结果,我最终在 SQL 2016 Server Management Studio 中有两个单独的 table。这两个 table 包含来自已拆分的 CSV 的值。因此,它们具有相同的列、列大小和数据类型。我决定使用 union all 查询来组合它们。当我这样做时,错误又回来了。然后我决定将最大服务器内存增加到 5 GB,我认为这应该绰绰有余。但是,当我重试 union all 查询时,错误又回来了。我的电脑总共有 8 GB 的 RAM。我正在使用 windows 10 64 位和基于 x64 的处理器。
table 的属性如下所示:
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
这是我如何进行查询的屏幕截图:
该错误看起来像 .NET 错误,而不是 SQL 服务器错误。
你是怎么查询的?如果您使用 System.Data.DataTable
进行查询,那么您 运行 客户端内存不足,因为它正在将其全部加载到内存中。
您应该改为使用 IDataReader
查询数据,这将流式传输数据 "firehose" 样式,您一次可以单向读取数据记录,因此您只有一个一次将几千条记录提取到客户端内存中——无论您的 table 有多大或您的 SELECT
语句返回多少条记录。
如果您使用了 import/export 实用程序,那将非常简单,即使使用批量插入,您也可以使用批处理并插入到相同的 table。然而,这不是世界末日,您可以再试一次。