我正在开发一个应用程序,它从巨大的文本文件(约2.5 GB)中读取行,将每一行操作成特定格式,然后将每一行写入文本文件。输出文本文件关闭后,程序会将数据“批量插入”(SQL Server)到我的数据库中。这个方法是可行的,只是速度比较慢。
我正在使用StreamReader和StreamWriter。
由于我必须操作文本,所以我基本上只能逐行读取文本;但是,我认为如果我制作一组行并每1000行左右写出一次该组行,它会至少加快一些速度。问题是(这可能仅仅是因为我的无知),我不能使用StreamWriter写入string[]。在探索StackOverflow和互联网的其余部分之后,我找到了File.WriteAllLines,它允许我将string[]写入文件,但我不认为我的电脑内存能够处理一次存储2.5 GB数据的操作。此外,文件被创建、填充和关闭,因此我需要制作大量较小的文件来拆分2 GB文本文件,以便将其插入数据库。所以我更愿意避免这种选择。
我能想到的一个解决方法是制作一个StringBuilder,并使用AppendLine方法添加每一行,以制作一个巨大的字符串。然后,我可以将该StringBuilder转换为字符串并将其写入文件。
但是,足够的猜测了。我已经实现了这种方法,但我想知道是否有人能够建议更好的方法来将数据块写入文件?
我正在使用StreamReader和StreamWriter。
由于我必须操作文本,所以我基本上只能逐行读取文本;但是,我认为如果我制作一组行并每1000行左右写出一次该组行,它会至少加快一些速度。问题是(这可能仅仅是因为我的无知),我不能使用StreamWriter写入string[]。在探索StackOverflow和互联网的其余部分之后,我找到了File.WriteAllLines,它允许我将string[]写入文件,但我不认为我的电脑内存能够处理一次存储2.5 GB数据的操作。此外,文件被创建、填充和关闭,因此我需要制作大量较小的文件来拆分2 GB文本文件,以便将其插入数据库。所以我更愿意避免这种选择。
我能想到的一个解决方法是制作一个StringBuilder,并使用AppendLine方法添加每一行,以制作一个巨大的字符串。然后,我可以将该StringBuilder转换为字符串并将其写入文件。
但是,足够的猜测了。我已经实现了这种方法,但我想知道是否有人能够建议更好的方法来将数据块写入文件?
FileStream
,按照文章所示进行扩展,然后创建一个StreamWriter
,将其传递给打开的FileStream
。请注意,会有一些启动成本(创建和扩展文件),但如果您使用我提到的三线程方法,大部分(也许是全部)都可以并发地完成,输出行流入输出缓冲区。 - Jim MischelBlockingCollection
,原因有很多。首先,它的接口更容易使用。例如,GetConsumingEnumerable
比编写消耗队列的循环要方便得多。而且CompleteAdding
功能也非常好用。BlockingCollection
为您提供了一个统一的接口,可以用于任何并发数据结构。例如,我可以将其用作并发堆栈或并发堆的接口,或者任何实现IProducerConsumerCollection
的类。虽然它的默认值是ConcurrentQueue
,但这真的非常方便。 - Jim Mischel