Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c语言分析大型csv文件中前两列的快速/低内存方法#_C#_.net_.net 4.0_Csv_Text Parsing - Fatal编程技术网

C# 使用c语言分析大型csv文件中前两列的快速/低内存方法#

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

我正在解析一个大的csv文件-大约500兆(许多行,许多列)。我只需要前两列(因此每行最多需要第二个逗号)。另外,多个线程需要同时访问该文件,因此我不能使用独占锁

解决此问题的最快/最少内存消耗的方法是什么?我应该看哪些类/方法?我认为我应该尽可能保持低水平——逐字逐行地阅读

也许这是一种允许同时访问的方式

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来说是典型的),您最好的选择可能是直接使用流和该方法,它允许您读入预先分配的缓冲区。这有几个优点:

  • 只分配一次缓冲区,而ReadLine()将为每一行创建一个新字符串

  • 您不必对整行执行Unicode转换;您可以只对第二个逗号之前的部分执行此操作,或者(如果您的时间受到严重限制),您可以编写自己的数字解析器,对缓冲区中的ASCII字符串数据进行操作(我相信有详细的算法可用于此操作)。当然,这是假设您需要数字数据


  • 您可能需要的其他方法包括这些方法,特别是
    Encoding.ASCII.GetString

    假设文件包含ASCII编码的文本(对于csv来说是典型的),您最好直接使用Stream和该方法,它允许您读入预分配的缓冲区。这有几个优点:

  • 只分配一次缓冲区,而ReadLine()将为每一行创建一个新字符串

  • 您不必对整行执行Unicode转换;您可以只对第二个逗号之前的部分执行此操作,或者(如果您的时间受到严重限制),您可以编写自己的数字解析器,对缓冲区中的ASCII字符串数据进行操作(我相信有详细的算法可用于此操作)。当然,这是假设您需要数字数据



  • 您可能需要的其他方法包括这些方法,特别是
    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应该更公平