1 時間ごとに 300 以上のファイルをサーバー共有に書き込む必要があります。CreateText を使用した簡単な実装では、ファイルごとに約 1.4 秒かかります。これを行うためのより良い方法があることは知っていますが、実際にどの方法が最も速く/最も効率的かはわかりません。したがって、私の質問:
何百もの小さなファイル (平均 336 バイト) をサーバー共有に書き込むのに最も効率的なテキスト書き込みクラスはどれですか?
1 時間ごとに 300 以上のファイルをサーバー共有に書き込む必要があります。CreateText を使用した簡単な実装では、ファイルごとに約 1.4 秒かかります。これを行うためのより良い方法があることは知っていますが、実際にどの方法が最も速く/最も効率的かはわかりません。したがって、私の質問:
何百もの小さなファイル (平均 336 バイト) をサーバー共有に書き込むのに最も効率的なテキスト書き込みクラスはどれですか?
前述のように、並列プログラミング/スレッドを使用します-基本的に400ループと4コアがある場合、各コアで100ループを実行するなど、迅速かつ効率的だと思います。
//File name and list of string content
var fileAndContent = new Dictionary<string, List<string>>();
Parallel.ForEach(fileContent, currentFile => { File.WriteAllLines(currentFile.Key, currentFile.Value); });
以下のリンクを参照してください。
http://msdn.microsoft.com/en-us/library/dd460717
http://msdn.microsoft.com/en-us/library/dd460720
括弧内に、各ファイルを処理するためのロジックを配置できます。ファイルパスと文字列の内容を辞書に追加します。次に、ファイルを保存するためのロジックを括弧内で処理します。どちらの方法でも、並列プログラミングを使用して必要なことを実行し、ラムダ式のコメントの後の括弧内で既に保存されているファイルの検証を処理できます。何もわかりません:)
File.WriteAllText メソッドをお勧めします。教訓は、実装者がパフォーマンスを気にしたに違いないため、C# に独自の方法で実行させることです。
次のコードで2つの関数のベンチマークを試みました(より良いコードがあればお気軽に提案してください):-
class Program
{
static void Main(string[] args)
{
const int _max = 1000000;
string data = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
string path="First\\" + "txt";
string path2 = "Second\\" + "txt";
var s1 = Stopwatch.StartNew();
for (int i = 0; i < 336; i++)
{
File.WriteAllText(path+i, data);
}
s1.Stop();
var s2 = Stopwatch.StartNew();
for (int i = 0; i < 336; i++)
{
using (StreamWriter sw = new StreamWriter(path2+i))
{
sw.WriteLine(data);
}
}
s2.Stop();
Console.WriteLine("Loop1 {0}\n",((double)(s1.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns"));
Console.WriteLine("Loop2 {0}\n", ((double)(s2.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns"));
Console.ReadKey();
}
}
そして、次の出力を得ました:-
出力のファイル数は次の3360
とおりでした:-
Loop1 16880.90
Loop2 17285.55
これには StreamWriter を使用しても問題ありません。ただし、おそらく最善の方法は、それらの多くを並行して実行し、OS が最も効率的な方法ですべての書き込みを処理できるようにすることです。
StreamWriter.Write と File.WriteAllText を使用して、長さ 1700 バイトの任意の lorem ipsum テキストを 300 回、300 の異なるテキスト ファイル (file1.txt、file2.txt など) に書き出すという実験を行いました。StreamWriter を使用すると 251 ミリ秒、WriteAllText を使用すると 161 ミリ秒かかりました。
使用した基本的なコードは次のとおりです。
string filename = @"c:\zfile";
Stopwatch sw = new Stopwatch();
sw.Start();
for (int x = 0; x < 300; x++)
{
string newfn = filename + x.ToString() + ".txt";
StreamWriter writer = new StreamWriter(newfn);
writer.Write(text);
writer.Close();
}
sw.Stop();
long em = sw.ElapsedMilliseconds;
Console.Write(em.ToString());
File.WriteAllText の場合、StreamWriter コードを次のように置き換えます。
File.WriteAllText(newfn, text);
このCreateTextについてあなたが何について書いているのかわかりませんが、遅いようです。