2013年03月03日

DataTableのMax行件数は4,194,304件? その2

テスト環境とかは前の記事のままです。
http://w033.seesaa.net/article/341752172.html

で、よくいろんなところに、DataSetを使うよりGenericで書けば早くなるって記載が散見されたのでプログラムをちょっといじって試してみた。
DataTableをやめて、List<Dictionary<string, object>>に頑張ってもらった。
ちなみに、一度メモリを食いつくしたたら仮想メモリがガリガリうるさいので再起動済。
※テストソースは下のほう。

[テスト結果]
ミリ秒単位の経過時間の合計 = 26366ms
プロセス名   :TestDataTableCon.vshost
物理メモリ使用量:1606888KByte
仮想メモリ使用量:1883164KByte
i=3550435

えええぇぇぇぇ。
さらに件数が減って3,550,435件で落ちる(OutOfMemoryException)。
しかも、こっちは実行するごとに件数に微差がでるので、本当にメモリで落ちているっぽく。
書き方が悪いのか? とか思って下のようにインデクサでInsertしていたので、Addにしてみる。
Dictionary row = new Dictionary();
row["A"] = i;
  ↓
row.Add("A",i);

[テスト結果]
ミリ秒単位の経過時間の合計 = 24130ms
プロセス名   :TestDataTableCon.vshost
物理メモリ使用量:1614072KByte
仮想メモリ使用量:1883024KByte
i=3562390

実行速度がちょっと早くなっただけだし。。。
ま、当り前か。
でもDictionaryをつかう限り、変えるところとかないし。

DataTableと比べて、速度面からみても、件数の割合からいうと微差程度。
メモリ使用量もDictionaryとどっこい?
予想外すぎる。

あとはList<List<KeyValuePaire<String,object>>>とか?
だまって2次元配列とか。
DataTableの性能が良いというべきか、Generic周りがSTLの代わりになると思うのが失敗なのか。
C#でunsafeってのもなぁ。

※もちろん、OSとハードスペックとかに依存します。
◆List+Dictionary
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Diagnostics;
using System.Threading;

namespace TestDataTableCon
{
class Program
{
static void Main(string[] args)
{
int i = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
List> collect = new List>();

try
{
for (i = 0; i < 100000000; i++)
{
if (1 == (i % 1000))
{
Console.WriteLine("i=" + i.ToString());
}

Dictionary row = new Dictionary();
//row["A"] = i;
//row["B"] = "B" + i.ToString("000000000");
//row["C"] = "C" + i.ToString("000000000");
//row["D"] = "D" + i.ToString("000000000");
//row["E"] = "E" + i.ToString("000000000");
//row["F"] = "F" + i.ToString("000000000");
//row["G"] = "G" + i.ToString("000000000");
row.Add("A",i);
row.Add("B","B" + i.ToString("000000000"));
row.Add("C","C" + i.ToString("000000000"));
row.Add("D","D" + i.ToString("000000000"));
row.Add("E","E" + i.ToString("000000000"));
row.Add("F","F" + i.ToString("000000000"));
row.Add("G","G" + i.ToString("000000000"));
collect.Add(row);
}

Console.WriteLine(collect.Count.ToString() + "行");

Console.WriteLine("正常終了");
}
catch(Exception ex)
{
Console.WriteLine(ex.Message + ex.StackTrace);
}

sw.Stop();
Console.WriteLine("ミリ秒単位の経過時間の合計 = {0}ms", sw.ElapsedMilliseconds);

// プロセス情報の表示
System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();currentProcess.Refresh();
String text = "プロセス名   :" + currentProcess.ProcessName + "\n" + "物理メモリ使用量:" + (currentProcess.WorkingSet64/1024) + "KByte\n" + "仮想メモリ使用量:" + (currentProcess.VirtualMemorySize64/1024) + "KByte";
Console.WriteLine(text);

Console.WriteLine("i=" + i.ToString());
Console.ReadKey();
}
}
}

posted by w033 at 21:34| 東京 ☁| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/341764696

この記事へのトラックバック