【发布时间】: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