从StreamReader中批量读取

2023-12-31

我在尝试通过 StreamReader 将 800MB 文本文件加载到 DataTable 时遇到了 OutOfMemory 异常。我想知道是否有办法从内存流中批量加载DataTable,即从StreamReader读取文本文件的前10,000行,创建DataTable,对DataTable执行一些操作,然后将接下来的10,000行加载到StreamReader中并很快。

我的谷歌在这里没有多大帮助,但似乎应该有一个简单的方法来做到这一点。最终,我将使用 SqlBulkCopy 将 DataTables 写入 MS SQL 数据库,因此,如果有比我所描述的方法更简单的方法,我将感谢您提供正确方向的快速指针。

编辑 - 这是我正在运行的代码:

public static DataTable PopulateDataTableFromText(DataTable dt, string txtSource)
{

    StreamReader sr = new StreamReader(txtSource);
    DataRow dr;
    int dtCount = dt.Columns.Count;
    string input;
    int i = 0;

    while ((input = sr.ReadLine()) != null)
    {

        try
        {
            string[] stringRows = input.Split(new char[] { '\t' });
            dr = dt.NewRow();
            for (int a = 0; a < dtCount; a++)
            {
                string dataType = dt.Columns[a].DataType.ToString();
                if (stringRows[a] == "" && (dataType == "System.Int32" || dataType == "System.Int64"))
                {
                    stringRows[a] = "0";
                }
                dr[a] = Convert.ChangeType(stringRows[a], dt.Columns[a].DataType);

            }
            dt.Rows.Add(dr);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        i++;
    }
    return dt;
}

这是返回的错误:

“System.OutOfMemoryException:引发了“System.OutOfMemoryException”类型的异常。
在 System.String.Split(Char[] 分隔符,Int32 计数,StringSplitOptions 选项)
在 System.String.Split(Char[] 分隔符}
在 C:... 中的 Harvester.Config.PopulateDataTableFromText(DataTable dt, String txtSource)

关于将数据直接加载到 SQL 中的建议 - 对于 C#,我有点菜鸟,但我认为这基本上就是我正在做的事情? SqlBulkCopy.WriteToServer 获取我从文本文件创建的 DataTable 并将其导入到 sql 中。有没有一种更简单的方法可以做到这一点,而我却错过了?

编辑:哦,我忘了提及 - 该代码不会与 SQL Server 在同一台服务器上运行。数据文本文件位于服务器 B 上,需要写入服务器 A 中的表。这是否妨碍使用 bcp?


您是否考虑过将数据直接加载到 SQL Server 中,然后在数据库中进行操作?数据库引擎已经设计为以有效的方式执行大量数据的操作。这可能会产生更好的总体结果,并允许您利用数据库和 SQL 语言的功能来完成繁重的工作。这是旧的“更聪明地工作,而不是更努力地工作”原则。

有许多将数据加载到 SQL Server 的不同方法 http://www.mssqltips.com/tip.asp?tip=1207,因此您可能需要检查这些内容,看看是否有合适的。如果您使用的是 SQLServer 2005 或更高版本,并且确实需要在 C# 中对数据进行一些操作,那么您始终可以使用托管存储过程 http://www.sqlteam.com/article/writing-clr-stored-procedures-in-charp-introduction-to-charp-part-1.

这里需要意识到的是OutOfMemoryException有点误导。内存不仅仅是您拥有的物理 RAM 的数量 http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx。你可能用完的是可寻址内存。这是完全不同的事情。

当您将大文件加载到内存并将其转换为DataTable它可能需要表示相同数据的大小远不止 800Mb。由于 32 位 .NET 进程仅限于不到 2Gb 的可寻址内存,因此您可能永远无法在单个批次中处理如此大量的数据。

您可能需要做的是以流方式处理数据。换句话说,不要尝试将其全部加载到DataTable然后批量插入到SQLServer。而是分块处理文件,在完成处理后清除先前的行集。

现在,如果您可以访问具有大量内存的 64 位计算机(以避免虚拟机抖动)并且 64 位 .NET 运行时的副本,您可能可以在不更改代码的情况下运行。但我建议无论如何进行必要的更改,因为即使在那种环境下它也可能会提高性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从StreamReader中批量读取 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include

随机推荐

  • SimpleCursorAdapter 在 API 版本 15 中已弃用?

    简单光标适配器使用以下注释弃用其构造函数之一 已弃用 不鼓励使用此选项 因为它会导致在应用程序的 UI 线程上执行游标查询 从而导致响应能力差甚至应用程序无响应错误 作为替代方案 将 android app LoaderManager 与
  • AttributeError:“str”对象没有属性“policy”

    我是Python新手 我正在尝试制作一个可以发送电子邮件的电子邮件脚本 首先 我制作了一个没有任何类的 Python 脚本 只是运行以确保脚本按预期运行 当我得到预期的结果后 我正在尝试使用类重写脚本 以便学习 但我收到错误 我不明白 我不
  • 将导航属性映射到主表

    我有课Contract有两个属性TotalAmount and InstallmentAmount public class Contract public int ContractId get set public Amount Tota
  • fork调用后的地址空间

    当进程执行 fork 系统调用时 会生成一个子进程 fork 调用之后的所有代码都被复制到新的内存物理页 即帧 我无法可视化子进程的虚拟内存部分 因为在下面的代码中 char 变量的地址在子进程和父进程中是相同的 include
  • 为什么要使用 Android 服务?

    我想知道当您需要做很多事情只是为了访问任何公共方法或从服务 例如较大的 List 对象 获取大量数据时 使用 Android 服务进行后台工作有什么意义 如果您愿意 为什么不直接使用一个简单的 POJO 它可以在单独的线程中在后台为您执行操
  • 无法解析 rxjava 2 中的 Observable.from 方法

    rxjava 1 中的 Observable 类中有一个 from 方法 但在 rxjava 2 中找不到 如何在以下代码中替换 rxjava 2 中的 from 方法 List
  • 傀儡节点主机名

    我正在使用木偶来配置服务器 我想在 erb 模板中打印当前机器 节点 名称 有hostname变量 但这包含 puppetmaster 主机名 关于这个主题有什么好的参考 列表吗 好像我错过了什么地方 我只需在 erb 模板中调用以下代码即
  • 在 Django 的 ORM 中访问存储过程的最佳方式是什么

    我正在设计一个相当复杂的数据库 并且知道我的一些查询将远远超出 Django ORM 的范围 有人成功地将 SP 与 Django 的 ORM 集成吗 如果是这样 什么 RDBMS 以及您是如何做到的 我们 musicpictures co
  • iPhone 版 Mapsforge 模拟

    我的 iPhone 应用程序需要一些框架 该应用程序使用地图 现在这些地图是光栅图像 我想通过制作矢量地图来优化我的应用程序 我知道我的 Android 开发同事已经使用 Mapsforge 框架来实现此目的 iPhone 上有类似的库吗
  • 为什么我们在查找素数时可以使用 sqrt(n) 而不是 n/2 作为上限? [复制]

    这个问题在这里已经有答案了 我们如何使用sqrt n 代替n 2在这段代码中 使用是否正确sqrt n static boolean isPrime long n if n lt 1 return false double limit Ma
  • 使用curses.h从键盘获取字符

    我正在尝试使用curses h 从键盘获取一个字符 这是我的来源 get char example c include
  • 为什么位域的类型会影响包含结构的大小?

    首先 这是 ISO C 标准关于位字段的规定 引用了N1570 http www open std org jtc1 sc22 wg14 www docs n1570 pdf2011 年 ISO C 标准草案 第 6 7 2 1 节 位字段
  • 为什么允许“src”属性链接到来自外部域的脚本,而 XmlHtppRequests 则不允许?

    我已经阅读了 StackOverflow 上有关同源策略的几个答案 但我似乎没有抓住本质部分 在所有使用的标签中src属性 比如
  • 如何在 django 1.3 中获取 POST 数据

    嘿 我正在按照本教程学习使用 Django 制作 wiki 页面 然而 它是用 django 0 96 制作的 而我使用 Django 1 3 所以有些东西是不同的 有些我已经自己修好了 但是这个我似乎无法让它发挥作用 我制作了一个将数据提
  • javascript:将 元素保存到磁盘上的文件

    在我的 HTML 上 我有一个 SVG 元素 它使用 d3js 渲染并在 CSS 中应用样式 当我右键单击浏览器时 我可以选择 保存图像 此操作将保存应用所有 CSS 样式呈现的图像 我一直在寻找保存文件的好方法 转到画布并导出画布 可另存
  • AVAudioPlayer.play() 不播放声音

    为什么下面的代码不播放声音 它为 play 返回 true 但我听不到任何声音 let path Users account Music sound mp3 let fileURL NSURL fileURLWithPath path va
  • iOS7中UITextView contentSize的变化和NSLayoutManager

    问题 UITextView默默地改变它contentSize在某些情况下 最简单的情况是带有大文本和键盘的textView 只需添加 UITextView 出口并设置 viewDidLoad as void viewDidLoad supe
  • UniqueIdentifier 现在导致 Apple 拒绝[重复]

    这个问题在这里已经有答案了 请不要将此标记为重复项 这个问题是关于辛佩瑞姆以及它处理 uniqueIdentifier 和identifierForVendor 的方式 Simperium仍在使用 UIDevice currentDevic
  • 在 PowerShell 中运行 Python

    我正在尝试使用指南来学习 Python 的基础知识 艰难地学习Python https en wikipedia org wiki Zed Shaw Books by 泽德 肖 https en wikipedia org wiki Zed
  • 从StreamReader中批量读取

    我在尝试通过 StreamReader 将 800MB 文本文件加载到 DataTable 时遇到了 OutOfMemory 异常 我想知道是否有办法从内存流中批量加载DataTable 即从StreamReader读取文本文件的前10 0