C# 使用c语言分析大型csv文件中前两列的快速/低内存方法#
我正在解析一个大的csv文件-大约500兆(许多行,许多列)。我只需要前两列(因此每行最多需要第二个逗号)。另外,多个线程需要同时访问该文件,因此我不能使用独占锁 解决此问题的最快/最少内存消耗的方法是什么?我应该看哪些类/方法?我认为我应该尽可能保持低水平——逐字逐行地阅读 也许这是一种允许同时访问的方式C# 使用c语言分析大型csv文件中前两列的快速/低内存方法#,c#,.net,.net-4.0,csv,text-parsing,C#,.net,.net 4.0,Csv,Text Parsing,我正在解析一个大的csv文件-大约500兆(许多行,许多列)。我只需要前两列(因此每行最多需要第二个逗号)。另外,多个线程需要同时访问该文件,因此我不能使用独占锁 解决此问题的最快/最少内存消耗的方法是什么?我应该看哪些类/方法?我认为我应该尽可能保持低水平——逐字逐行地阅读 也许这是一种允许同时访问的方式 using ( var filestream = new FileStream( filePath , FileMode.Open , FileAccess.Read , FileShare
using ( var filestream = new FileStream( filePath , FileMode.Open , FileAccess.Read , FileShare.Read ) )
{
using ( var reader = new StreamReader( filestream ) )
{
...
}
}
编辑决定退房 这似乎让我能够只阅读两列,然后跳到下一行。
它们也有一些基准测试,显示了快速性能和低内存配置。如果您想要低内存,您可能会使用StreamReader和逐行读取
在前几天的一个类似案例中,我能够跳过500 MB文件中的前20000000行,并在大约7秒钟内为接下来的1000000行构建一个字符串(使用StringBuilder)。如果您需要低内存,您可能会使用StreamReader并逐行读取
在前几天的一个类似案例中,我能够跳过500 MB文件中的前20000000行,并在大约7秒内(使用StringBuilder)为接下来的1000000行构建一个字符串。假设该文件包含ASCII编码的文本(对于csv来说是典型的),您最好的选择可能是直接使用流和该方法,它允许您读入预先分配的缓冲区。这有几个优点:
您可能需要的其他方法包括这些方法,特别是
Encoding.ASCII.GetString
假设文件包含ASCII编码的文本(对于csv来说是典型的),您最好直接使用Stream和该方法,它允许您读入预分配的缓冲区。这有几个优点:
您可能需要的其他方法包括这些方法,特别是
Encoding.ASCII.GetString
当您需要处理流时,您至少需要在行上有一个锁。否则:一个线程获取一行开始读取,第二个线程将流移动到新行。。。等等,瞧…@Andreas-你能看看我贴在原始问题上的代码吗。这是否解决了同时访问的问题?同时访问在很大程度上取决于您对文件所做的操作。如果他们都只是读书,那么你的身体就很好。如果其中一个需要写入文件,则存在竞争条件,您需要仔细协调读写。@Dan-谢谢!看起来我的状态很好,因为我只从这些文件中读取数据。因为你需要处理流,你至少需要在线路上有一个锁。否则:一个线程获取一行开始读取,第二个线程将流移动到新行。。。等等,瞧…@Andreas-你能看看我贴在原始问题上的代码吗。这是否解决了同时访问的问题?同时访问在很大程度上取决于您对文件所做的操作。如果他们都只是读书,那么你的身体就很好。如果其中一个需要写入文件,则存在竞争条件,您需要仔细协调读写。@Dan-谢谢!我的状态似乎很好,因为我只从这些文件中读取数据。我建议使用.Read()
,因为它不会读取整行数据,而是逐字符读取。这对于低内存消耗可能更好:)@Andreas Niedermir:它还说“快”-(为此,您需要测量:)取决于我仍然给出的行的长度。阅读一个更好的更改以赢得性能挑战:)@Andreas:I/O和内存使用将(大约)相同。1行的大小可能微不足道,StreamReader可能会缓存更多。使用Read()会增加一些CPU开销。@Henk:谢谢你的启发:)明天会做一些测量。我建议使用.Read()
,因为它不会读取整行内容,而是逐字符读取。这对于低内存消耗可能更好:)@Andreas Niedermir:它还说“快”-(为此,您需要测量:)取决于我仍然给出的行的长度。阅读一个更好的更改以赢得性能挑战:)@Andreas:I/O和内存使用将(大约)相同。1行的大小可能微不足道,StreamReader可能会缓存更多。使用Read()会增加一些CPU开销。@Henk:谢谢你的启示:)明天会做一些测量。你可能对缓冲区的看法是正确的,对编码的看法更是如此。但还不太清楚,如果您使用ReadLine并保持字符串的生存期较短,那么GC开销应该很小。对于更复杂的场景,这会容易得多。@Henk,我同意,使用ReadLine肯定更简单,GC应该更公平