【发布时间】:2012-12-12 02:33:55
【问题描述】:
我有一个非常冗长的问题。我的雇主最近给了我一项任务,我要在 C# 中从 117 个 *.dbf 文件创建自定义 DBF 到 SQL 迁移实用程序。每个表大约有 40-50 列和 100 多行。 (如物业管理数据库)
我的处理方法如下:
- 将 dbf 文件转换为 DataTable 对象。
- 将 DataTable 对象添加到模型对象中包含的
List<DataTable>。 - 将列表绑定到 DataGridView 以进行列查看。
这一切都在后台工作人员中完成,工作正常。
接下来我需要做的是允许用户将此列表转换并保存到一个非常大的 *.sql 文件中(或者,可以选择将其直接迁移到 SQL Express)。同样,我尝试在后台线程中执行此操作。
这是我遇到问题的地方。我有一个接受 DataTable 对象并返回字符串的方法。在其中,我有一个 stringbuilder 对象,它将所有列连接成一个“创建表”语句并附加相关的插入语句以包含数据。
此方法在循环中执行,同时从存储在模型对象中的List<DataTable> 传递每个 DataTable 的实例。
现在这可以正常工作,直到大约第四个或第五个 DataTable 才会引发“内存不足”异常。我一定会启动并处理我不使用的任何对象。我什至将所有字符串连接更改为 stringbuilder 附加逻辑,以利用 stringbuilders 更好的内存管理。
我很确定我的所有对象都被释放并被垃圾回收,所以我假设问题在于我将所有 117 个表存储在模型对象列表中。每当我需要访问这个列表时,我只需传递一个对模型对象的引用。一旦我开始为所有表、DataTables 列表和 Stringbuilder 对象之间的组合构建一个 sql 语句,它就会耗尽内存。
由于我刚从大学毕业,所以我没有告知我是这个行业的新手。我已经编程了很多年,直到最近我一直在遵循“最佳实践”。所以我的问题是对你们所有人,我是否以错误的方式处理这个项目?有没有更好的方法?如果有,你能帮忙说明一下你会代替我做什么吗?
【问题讨论】:
-
正确。 DBF 到 DataTables 之间的转换工作正常。由于存储数据表列表和构建字符串构建器对象的组合而导致内存不足。
-
您不是在 StringBuilder 对象上多次调用 ToString() 方法,只是在最后要将数据写入文件并创建 .sql 文件?当您在不使用 StringBuilder 对象的情况下连接字符串时,内存会很糟糕。
-
你考虑过使用 SSIS 吗?
-
我在 stringbuilder 上调用 ToString() 方法的唯一时间点是在方法的末尾。
-
Eric - 老实说,我对数据迁移还很陌生。这是我第一次听说SSIS。有没有推荐的教程?
标签: c# exception memory data-migration memory-management