-3

ファイルをコピーし、その内容を解析して改行を削除し、コンテンツをパイプに沿って分割し、結果の string[] をデータベースに保存する必要があります。私のファイルはそれぞれ 65000 の有効なレコードまで大きくなる可能性があるため、パフォーマンスは不可欠です。

以下は私が現在持っているものです。問題は、非常に遅いことです (65000 行を処理するのに 3 時間)。私の実行が大幅に高速化されるように、この部分の最適化を改善するための助けをいただければ幸いです。

public void ReadFileLinesIntoRows()
    {
        try
        {
            using (var reader = new TextFieldParser(FileName))
            {
                reader.HasFieldsEnclosedInQuotes = false;
                reader.TextFieldType = FieldType.Delimited;
                reader.SetDelimiters("|");
                String[] currentRow;
                while (!reader.EndOfData)
                {
                    try
                    {
                        currentRow = reader.ReadFields();
                        int rowcount = currentRow.Count();
                        //if it is less than what you need, pad it.  
                        if (rowcount < 190)
                        {
                            Array.Resize<string>(ref currentRow, 190);  
                            rows.Add(currentRow);
                        }
                        else
                        {
                            rows.Add(currentRow);
                        }
                    }
                    catch (MalformedLineException mex)
                    {
                        unreadlines.Add(reader.ErrorLine);//continue afterwards
                    } 
                }
                this.TotalRowCount  = rows.Count();
            }
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

   public void cleanfilecontent(String tempfilename, Boolean? HeaderIncluded)
    {
        try
        { 
            //remove the empty lines in the file 
            using (var sr = new StreamReader(tempfilename))
            {
                // Write new file
                using (var sw = new StreamWriter(CleanedCopy))
                {
                    using (var smove = new StreamWriter(duptempfileremove))
                    {
                        string line;

                        Boolean skippedheader = false;
                        while ((line = sr.ReadLine()) != null)
                        {
                            // Look for text to remove
                            if (line.Contains("----------------------------------"))
                            { 
                                smove.Write(line);
                            }
                            else if (HeaderIncluded.HasValue && HeaderIncluded.Value==true && ! skippedheader)
                            {
                                smove.Write(line);
                                skippedheader = true;
                            }
                            else if(skippedheader)
                            {
                                // Keep lines that does not match
                                sw.WriteLine(line);
                            } 
                        }
                        smove.Flush();
                    }
                    sw.Flush();
                }
                sr.Close();
            }
        }
        catch (Exception ex)
        {

            throw ex;
        }

    }
4

1 に答える 1

0

65000 レコードはそれほど大きくありません。十分なメモリがある場合は、ファイル全体をメモリに読み取り、解析を実行して行を構築し、バッチ挿入を使用してデータを DB にコミットすることをお勧めします。これが最速になります!あなたの 3 時間のほとんどは、データベース レコードを 1 つずつデータベースに挿入するのに費やされていると思います。

于 2012-10-09T03:27:11.010 に答える