1

多くのエントリを含む大きなテキスト ファイルがある場合、それらを取得してリストに保存する必要があります。

    /// <summary>
    /// Reads Data from the given path
    /// </summary>
    /// <param name="path">Path of the File to read</param>
    public void Read(string path)
    {
        try
        {
            FileStream file = new FileStream(path, FileMode.Open);
            StreamReader reader = new StreamReader(file);
            string line;

            while ((line = reader.ReadLine()) != null)
            {                
                myList.Add(line);
                System.Windows.Forms.Application.DoEvents();
            }
            reader.Close();
            file.Close();
        }
        catch (Exception c)
        {
            MessageBox.Show(c.Message);
        }

    }
4

3 に答える 3

6

より速く-おそらくそうではありませんが、はるかに短いですか?はい:

myList.AddRange(File.ReadAllLines(path));

また、これが非常に大きなファイルである場合は、UIスレッドで読み込みを行うべきではありません。バックグラウンドワーカーを使用するだけで、すべての行を呼び出す必要がなくなりApplication.DoEvents()、元のアプローチよりもいくらか高速になります。ファイルI/Oのコストに対して、節約は最小限に抑えられますが、よりクリーンなコードが得られます。

于 2011-03-30T00:02:31.677 に答える
4

通常はこれをコメントにしますが、この場合は実際には答えです。

いいえ、ありません。ファイルを読むよりも速く読むことはできません...それを読む!

ファイルの読み取りは直線的な時間です。

ここで、ファイルに関する情報を知っている場合、たとえば...ヘッダー情報をスキップしたい場合は、先にスキップすることで実行できます。ただし、ファイル内の場所が前のデータ(固定幅ではない)に依存している場合、またはファイル内のすべての行が必要な場合は、それより速くなることはありません。

于 2011-03-29T23:59:44.703 に答える
1

DoEvents() を取り除く必要があります。試してみてください: ファイルを読み込んでいる間にフォームを閉じてください。プログラムは停止しないことに注意してください。読み取りが完了すると、クラッシュして死ぬ可能性が高いです。

これにより、ファイルの読み取りもかなり高速化されるはずです。UI がフリーズしないようにするには、BackgroundWorker を使用する必要があります。これを正しく行うには、MSDN ライブラリの記事を必ず読んでください。

高速化するにはハードウェアが必要です。なぜそのような大きなテキスト ファイルを読まなければならないのかという疑問から始めてください。そのファイルの情報はおそらくデータベースに属しています。

于 2011-03-30T00:42:18.680 に答える