2011-07-28 9 views
1

私はC#のランダムなクラスからランダムな文字列と数値を生成するコードを持っています。それをテキストファイルに書き込みます。どのように私はパフォーマンスを向上させることができますか? コードは次のとおりです。100000行のデータが含まれている場合、C#で超高速アスキーファイルを書き込む方法は?

int i = 0; 
    Record[] rec = new Record[100000]; 
    Class1 cl = new Class1(); 
    Random random = new Random(); 
    while (i < 100000) 
    { 
     rec[i].num1 = random.Next(); 
     rec[i].num2 = random.Next(); 
     rec[i].mult = rec[i].num1 * rec[i].num2; 
     rec[i].rel = true; 
     rec[i].name = cl.generateRandomString(1); 
     rec[i].var_set = cl.generateRandomString(2);   
     using (StreamWriter writer = new StreamWriter("important.txt", true)) 
     { 

      writer.Write(rec[i].name); 
      writer.Write(" "); 
      writer.Write(rec[i].var_set); 
      writer.Write(" "); 
      writer.Write(rec[i].num1); 
      writer.Write(" "); 
      writer.Write(rec[i].num2); 
      writer.Write(" "); 
      writer.Write(rec[i].mult); 
      writer.Write(" "); 
      writer.WriteLine(rec[i].rel); 
     } 
     i++; 
+1

どうやってやっていますか? –

+11

私たちにいくつかのコードを見せてください。それが遅くなる理由は何百万もあり、私たちは霊的ではありません。 – hammar

+1

現在のコードを表示できますか? – pstrjds

答えて

2

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
int i = 0; 
while (i < 100000) 
{ rec[i].num1 = random.Next(); rec[i].var_set = cl.generateRandomString(2); i++; }; 

i = 0; 
using (StreamWriter writer = new StreamWriter("important.txt", true)) 
    { 

     while (i < 100000) 
     { 
     writer.Write(rec[i].name); 
     writer.Write(" "); 
     writer.Write(rec[i].var_set); 
     writer.Write(" "); 
     writer.Write(rec[i].num1); 
     writer.Write(" "); 
     writer.Write(rec[i].num2); 
     writer.Write(" "); 
     writer.Write(rec[i].mult); 
     writer.Write(" "); 
     writer.WriteLine(rec[i].rel); 

     i++; 
     }; 
    } 

EDIT - 別のオプション:あなたは@Benコメントで供給されたコードに基づいて

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
int i = 0; 
while (i < 100000) 
{ rec[i].num1 = random.Next(); rec[i].var_set = cl.generateRandomString(2); i++; }; 

File.WriteAllLines ("important.txt", (from r in rec select r.name + " " + 
r.var_set + " " + r.num1 + " " + r.num2 + " " + r.mult + 
" " + r.rel).ToArray()); 
+0

私は、テキストファイルをC#で書くことができるかどうかを調べるために小さなテストをしようとしています。大量のデータ(ファイルサイズ50MB(100,000レコード)上記のコード)。上記のプログラムは乱数と文字列を生成します(c1.generaterandomstring(2)。私のプログラムは将来、データベースを読み込んでテキストファイルに書き出します)、これは潜在的にボトルネックになるかもしれないと感じています。 – user1122

+0

私は理解しています...私はあなたがあなたのコードよりも速く書くと思った... EDITからコードを試しましたか?はい、あなたが投稿したコードより速かったですか? – Yahia

+0

ありがとうYahia :)。もう一度感謝しました。 – user1122

1

System.IO.MemoryMappedFiles.MemoryMappedFileは信じられないほど高速です。

しかし、おそらくパフォーマンスの問題は、出力をフォーマットし、実際にファイルを書き込んでいないことが原因です(ディスク書き込みキャッシュが有効な場合、ファイル書き込みは非常に高速です)。

あなたがこれを行うとき、何が起こる
+2

またはおそらくランダムソースの速度 – IanNorton

+0

は次のようになります。1stは10000回のforループで、これはランダムな文字列を生成して乱数を生成し、その文字列と数値をファイルに書き込みます。その後、同じプロセスが100000回まで繰り返されます。 – user1122

+0

@user:_Show_私たちはあなたのプログラムが何をしているのかを理解しています。 –

5

を、私はこのコードのことを得ましたあなたは使用しています。

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
while (i < 100000) 
{ 
    rec[i].num1 = random.Next(); 
    rec[i].var_set = cl.generateRandomString(2); 
    using (StreamWriter writer = new StreamWriter("important.txt", true)) 
    { 
     writer.Write(rec[i].name); 
     writer.Write(" "); 
    } 
    i++; 
} 

私が見ている最大の問題は、ループの繰り返しごとにストリームライターを開いていることです。ファイルを一度しか開くことができないように、コードをこのようなものに変更することをお勧めします。

int i = 0; 
Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
StreamWriter sr = new StreamWriter("important.txt", true); 

try 
{ 
    while (i < 100000) 
    { 
     rec[i].num1 = random.Next(); 
     rec[i].var_set = cl.generateRandomString(2); 
     sr.Write(rec[i].name); 
     sr.Write(" "); 
     i++; 
    } 
} 
finally 
{ 
    sr.Close(); 
} 
+0

そこにいくつかの大文字小文字の誤りがありますが、私はあなたが問題にぶつかったと思います。もう一つの可能​​性のある改良は、 'rec [i]'が言及されるたびに配列検索の代わりに一時変数を使うことです。 –

+0

ええ、基本的な問題を説明するだけで、実際にコンパイルするつもりはありませんでした。シンタックスを自由に修正してください。このマシンにはIDEがなく、C#は母国語ではありません。 – Kibbee

0

本当にあなたの質問を編集し、コメントからコードを含める必要があります。

だから、コメントから、あなたの現在のコードです:

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
while (i < 100000) 
{ 
    rec[i].num1 = random.Next(); 
    rec[i].var_set = cl.generateRandomString(2); 
    using (StreamWriter writer = new StreamWriter("important.txt", true)) 
    { 
     writer.Write(rec[i].name); 
     writer.Write(" "); 
    } 
    i++; 
} 

それと間違っている何が外側のループの反復ごとに100000回、開いて書き込み、ファイルを閉じているという事実です。

はループの外のオープン/クローズのロジックを置く:

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
using (StreamWriter writer = new StreamWriter("important.txt", true)) 
{ 
    while (i < 100000) 
    { 
     rec[i].num1 = random.Next(); 
     rec[i].var_set = cl.generateRandomString(2); 
     writer.Write(rec[i].name); 
     writer.Write(" "); 
     i++; 
    } 
} 
0

パフォーマンスは常にアプリケーション固有である、唯一のあなたは本当に「超高速」であるかを定義することができます。ところで、すでに@Benが提供しているソリューション+の1つは、チャンクごとに20,000行のような大きなデータを持ち、5ショットで書き込むことです.100,000行の大きなデータのチャンクアプリ、なぜですか?良い解決策でもありますが、それはあなたの状況に特有なものです。だから、Rico Marianiは「測定、測定、測定」と言っています。

よろしくお願いいたします。

関連する問題