C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DataPointCollectionの最大数

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■90336 / inTopicNo.1)  DataPointCollectionの最大数
  
□投稿者/ はんかく (1回)-(2019/02/27(Wed) 16:20:48)

分類:[.NET 全般] 

C#やVBでDataPointCollectionクラスというものがありますが、

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datavisualization.charting.datapointcollection?view=netframework-4.7.2

64-bitモードで動作したとして
最大数はいくつになりますか?

配列だと
Dim aaa(9999)
のように宣言できますが、
DataPointCollectionだとどのように確かめれば良いですか?




引用返信 編集キー/
■90337 / inTopicNo.2)  Re[1]: DataPointCollectionの最大数
□投稿者/ Hongliang (761回)-(2019/02/27(Wed) 16:49:15)
大半のコレクションは最終的には内部で配列として扱っているため、最終的には配列の限界が要素数の限界になります。
// もちろん、プロセスの使用メモリサイズの上限の方が先に来た場合はそこまでですが。
.NETでは1オブジェクト2GBまでという制限があります。参照型だと確か1要素16バイトになるから、要素数134,217,728個ですか。
.NET 4.5以降では、app.configに記述することによってこの制限を取り払い純粋に要素数のみの制限にできるようになりました。
https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element
これで要素数2,146,435,071個まで確保できるようです。
// まあ多分それ以前にプロセスのメモリ上限に到達します。

> 配列だと
> Dim aaa(9999)
> のように宣言できますが、
> DataPointCollectionだとどのように確かめれば良いですか?

この記述が言いたいことはよく分かりませんが…。
何を確かめるのでしょうか。
現在の要素数であればCountプロパティで取得できます。
これ以上は入れられないという上限を設けたいなら、ご自分で管理する必要があります。
(AddするときにCountを見て、有効な数を超えていたらそれなりの処理を記述する)
引用返信 編集キー/
■90346 / inTopicNo.3)  Re[2]: DataPointCollectionの最大数
□投稿者/ はんかく (3回)-(2019/02/28(Thu) 17:55:59)
ありがとうございます。

一つ疑問なのですが、
> app.configに記述することによってこの制限を取り払い純粋に要素数のみの制限にできるようになりました。

app.configに記述する、というのは
何を記述するのですか?
DataPointCollectionクラスを宣言ということではないですよね?

引用返信 編集キー/
■90347 / inTopicNo.4)  Re[3]: DataPointCollectionの最大数
□投稿者/ Hongliang (762回)-(2019/02/28(Thu) 18:10:47)
リンク先に丸々書かれていますが…?
引用返信 編集キー/
■90348 / inTopicNo.5)  Re[4]: DataPointCollectionの最大数
□投稿者/ はんかく (4回)-(2019/02/28(Thu) 19:10:09)
ありがとうございます。

確かに書かれてありました。
これってDataPointCollectionクラスに限らず
SingleやInteger配列の場合にも制限が解除されるのですよね?

多次元配列の場合には、どこまで大きくすることができますか?

引用返信 編集キー/
■90349 / inTopicNo.6)  Re[5]: DataPointCollectionの最大数
□投稿者/ kaina (47回)-(2019/02/28(Thu) 19:27:33)
リンク先ちゃんと読みましょうよ。。。

The maximum number of elements in an array is UInt32.MaxValue.

The maximum index in any single dimension is 2,147,483,591 (0x7FFFFFC7) for byte arrays and arrays of single-byte structures, and 2,146,435,071 (0X7FEFFFFF) for other types.

引用返信 編集キー/
■90350 / inTopicNo.7)  Re[6]: DataPointCollectionの最大数
□投稿者/ はんかく (5回)-(2019/02/28(Thu) 19:33:22)
singleやintegerはsingle byteではないので、
2,146,435,071 が最大ということでしょうか?

1次元の場合は、と書かれてありますが
多次元の場合はどこに書かれてありますか?

引用返信 編集キー/
■90351 / inTopicNo.8)  Re[7]: DataPointCollectionの最大数
□投稿者/ Hongliang (763回)-(2019/02/28(Thu) 20:02:06)
> The maximum number of elements in an array is UInt32.MaxValue.
1つの配列の最大要素数はUInt32.MaxValue、つまり4,294,967,296個です。

> The maximum index in any single dimension is 2,147,483,591 (0x7FFFFFC7) for byte arrays and arrays of single-byte structures, and 2,146,435,071 (0X7FEFFFFF) for other types.
1つの次元における最大インデックスはバイトまたは1バイト構造体の配列の場合は2,147,483,591、それ以外の型は2,146,435,071です。

ということで、何次元だろうが要素数最大は4,294,967,296個。2次元ならX*Yの合計がこれを超えることはできません。
そして、各次元の最大インデックスはバイト配列を除けば2,146,435,071。2次元配列で片方の次元がこのサイズだと、もう片方の次元に3とか指定すると1つめの制限をオーバーすることになります。

// しかし元々の質問はどういう意図だったんだろう。
引用返信 編集キー/
■90352 / inTopicNo.9)  Re[8]: DataPointCollectionの最大数
□投稿者/ はんかく (6回)-(2019/02/28(Thu) 20:17:34)
なるほど、納得しました
ありがとうございます。

DataPointCollectionの場合には、16バイトなので、
gcAllowVeryLargeObjectsを有効にすることで、しない場合と比べて16倍まで大きな配列を使用することができますが、
singleやintegerや4バイトなので、4倍分しか得をしないと思うのですが
この認識は合っていますでしょうか?

引用返信 編集キー/
■90354 / inTopicNo.10)  Re[9]: DataPointCollectionの最大数
□投稿者/ 魔界の仮面弁士 (2080回)-(2019/03/01(Fri) 15:41:30)
2019/03/01(Fri) 15:49:19 編集(投稿者)

No90352 (はんかく さん) に返信
> なるほど、納得しました
> ありがとうございます。

そもそも何のために上限を調べているのでしょうか。

大量の DataPoint を登録したところで
レンダリングしきれるものではないですよね。

配列自体の制限として、上限値として
 const int MaxArrayLength   = 0x7FEFFFFF;
 const int MaxByteArrayLength = 0x7FFFFFC7;
があって、多くのコレクションの内部実装が、最終的には配列として
管理されていて、その時に上記の設定が使われていたとしても、
コレクションの上限が配列上限と一致するかどうかは、また別の話でしょう。


仮に DataPointCollection のためではなく、単純な配列で管理されるのだとしても、
現実には上限サイズに届く前に OutOfMemoryException などに陥る可能性が高いですし、
同一 PC 上で実行した場合でも、実行するごとに閾値が変化することはザラにあります。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ