【发布时间】:2013-10-30 21:35:00
【问题描述】:
我想创建一个类似于SqlDataReader.Read()的功能
我正在从 .txt/.csv 读取一个平面文件,并将其作为数据表返回给我的类处理业务逻辑。这会遍历数据表的行,并转换数据,写入结构化数据库。我将此结构用于多个导入源。
虽然文件很大,但运行起来非常非常缓慢。浏览 30 MB 数据需要 2 小时,我希望将其缩短到 30 分钟。朝这个方向迈出的一步是不要将整个文件读入 DataTable,而是逐行处理,并防止内存被占用。
这样的东西比较理想:PSEUDOCODE。
FlatFileReader ffr = new FlatFileReader(); //Set FlatFileParameters
while(ffr.ReadRow(out DataTable parsedFlatFileRow))
{
//...Business Logic for handling the parsedFlatFileRow
}
如何实现类似.ReadRow(out DataTable parsedFlatFileRow) 的方法?
这是正确的方向吗?
foreach(obj in ff.lazyreading()){
//Business Logic
}
...
class FlatFileWrapper{
public IEnumerable<obj> lazyreading(){
while(FileReader.ReadLine()){
yield return parsedFileLine;
}
}
}
【问题讨论】:
-
FileHelpers 对你来说可能是个不错的选择:filehelpers.sourceforge.net
-
您可能还没有确定性能不佳的原因。您猜测这是内存使用情况,但我对此非常怀疑。分析应用程序,或暂停调试器 10 次以查看它最常停止的位置。
-
不,你是对的 - 我还没有分析它。但是在此 SQL Server 上,内存使用是一个已知问题,在处理大文件时尤其受到注意。因此,保持低内存使用本身就是一个优先事项。