Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
File 有没有有效的方法来解析大型文本文件和存储解析信息?_File_C# 4.0 - Fatal编程技术网

File 有没有有效的方法来解析大型文本文件和存储解析信息?

File 有没有有效的方法来解析大型文本文件和存储解析信息?,file,c#-4.0,File,C# 4.0,我的目的是解析文本文件并将信息存储在相应的表中 我必须解析大约100个文件夹,其中包含8000多个文件,总大小约为20GB。 当我试图将整个文件内容存储在一个字符串中时,抛出了内存溢出异常 就是 using (StreamReader objStream = new StreamReader(filename)) { string fileDetails = objStream.ReadToEnd(); } 因此我尝试了一种逻辑,比如 using

我的目的是解析文本文件并将信息存储在相应的表中

我必须解析大约100个文件夹,其中包含8000多个文件,总大小约为20GB。 当我试图将整个文件内容存储在一个字符串中时,抛出了内存溢出异常

就是

 using (StreamReader objStream = new StreamReader(filename))
        {
          string fileDetails = objStream.ReadToEnd();
}
因此我尝试了一种逻辑,比如

     using (StreamReader objStream = new StreamReader(filename))
        {

 // Getting total number of lines in a file
        int fileLineCount = File.ReadLines(filename).Count(); 

        if (fileLineCount < 90000)
           {
            fileDetails = objStream.ReadToEnd();
            fileDetails = fileDetails.Replace(Environment.NewLine, "\n");
            string[] fileInfo = fileDetails.ToString().Split('\n');
            //call respective method for parsing and insertion
           }
        else
          {
            while ((firstLine = objStream.ReadLine()) != null)
             {
               lineCount++;
               fileDetails = (fileDetails != string.Empty) ? string.Concat(fileDetails, "\n", firstLine)
                                    : string.Concat(firstLine);
                if (lineCount == 90000)
                 {
                    fileDetails = fileDetails.Replace(Environment.NewLine, "\n");
                  string[] fileInfo = fileDetails.ToString().Split('\n');
                   lineCount = 0;
                 //call respective method for parsing and insertion
                 }
             }
             //when content is 90057, to parse 57
             if (lineCount < 90000 )
              {
                 string[] fileInfo = fileDetails.ToString().Split('\n');
                 lineCount = 0;
                 //call respective method for parsing and insertion
              }
          }
        }
使用(StreamReader objStream=newstreamreader(文件名))
{
//获取文件中的总行数
int fileLineCount=File.ReadLines(filename.Count();
如果(文件行数<90000)
{
fileDetails=objStream.ReadToEnd();
fileDetails=fileDetails.Replace(Environment.NewLine,“\n”);
字符串[]fileInfo=fileDetails.ToString().Split('\n');
//调用相应的方法进行解析和插入
}
其他的
{
而((firstLine=objStream.ReadLine())!=null)
{
lineCount++;
fileDetails=(fileDetails!=string.Empty)?string.Concat(fileDetails,“\n”,第一行)
:string.Concat(第一行);
如果(行数==90000)
{
fileDetails=fileDetails.Replace(Environment.NewLine,“\n”);
字符串[]fileInfo=fileDetails.ToString().Split('\n');
行数=0;
//调用相应的方法进行解析和插入
}
}
//当内容为90057时,要解析57
如果(行数<90000)
{
字符串[]fileInfo=fileDetails.ToString().Split('\n');
行数=0;
//调用相应的方法进行解析和插入
}
}
}
这里90000是大容量大小,对于我的案例,它可以安全地处理,而不会出现内存不足异常

不过,这一过程需要两天多的时间才能完成。我观察到这是因为逐行阅读

有没有更好的方法来处理这个问题


提前感谢:)

您可以使用探查器来检测影响性能的因素。在这种情况下,很明显:磁盘访问和字符串连接

  • 不要多次读取文件。让我们看看你的代码。首先,行
    int fileLineCount=File.ReadLines(filename.Count()表示您读取了整个文件,并放弃了所读取的内容。那太糟糕了。扔掉你的
    if(fileLineCount<90000)
    ,只保留
    else
  • 无论您是以连续顺序逐行读取还是整个文件,这几乎无关紧要,因为在任何情况下读取都是缓冲的

  • 避免字符串连接,尤其是对于长字符串

    fileDetails=fileDetails.Replace(Environment.NewLine,“\n”); 字符串[]fileInfo=fileDetails.ToString().Split('\n')

  • 真糟糕。您逐行读取文件,为什么要进行替换/拆分
    File.ReadLines()
    提供所有行的集合。只需将其传递给解析例程


    如果你能做到这一点,我预计会有显著的加速。它可以通过在主线程中处理文件的同时在单独的线程中读取文件来进一步优化。但这是另一个故事。

    那么真正的长线呢?你能详细说明你在这里的确切意思吗?你可以数线,但线的长度可以不同,一般来说是任意的。除前两行外,所有线的长度都是固定的。前两行的信息将用于其他行。这些文件是从外部提供的。示例:test | 1234 | 2e34 | | | | | | | | | | | testdata test1 | 23456 | Xez234 | | G | 1 | | | FemaleI have修改了问题。请看一看。谢谢:)我遵循了上面的建议,比如通过逐行阅读来获取字符串集合中的文件内容。删除了那些替换和拆分以及文件行计数。它提高了性能。因为大约有90000个文件,所以我需要实现线程。@user2139242:如果这有助于你提高asnwer的投票率,如果它回答了你的问题,你可以接受它,如果你需要信息,你可以发布另一个更具体的问题