
C#で別クラスのインスタンスからメンバ変数のデータを使用する場合に、メモリ使用量増加がどうなるのかをご教授ください。
例)
class main{
public void program(){
dataClass dc = new dataClass();
dc.dataRead(); ←確認点③で少し変わる。
###この後にdcのメンバ変数をファイル出力する場合の使い方ごとのメモリ使用量変化をご教授願いたいです。###
}
}
class dataClass{
public string readData;
public void dataRead(){ ←確認点③で少し変わる。
readData = File.ReadAllText("XXXX.txt");
}
}
<確認点>
以下のdataClassクラスのメンバ変数使い方ごとの、メモリ使用量変化をご教授下さい。
①File.WriteAllText関数の引数に直接使用。
(program関数)
File.WriteAllText("out.txt",dc.readData);
②一旦メンバ変数を取って、File.WriteAllText関数に使用。
(program関数)
string readData = dc.readData;
File.WriteAllText("out.txt",readData);
③メンバ変数をやめ、out修飾子引数を足してprogram関数にデータを持たせる。
(program関数)
string readData;
dc.dataRead(out readData);
File.WriteAllText("out.txt",readData);
(dataRead関数)
public void dataRead(out string readData){
readData = File.ReadAllText("XXXX.txt");
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
まず、いずれの場合も、File.ReadAllTextによって、ファイルの全内容が格納されたStringのオブジェクトが作られます。
これは、どの方式を使っても同じです。
String型の変数は、そのオブジェクトの場所(参照値)を覚えるだけの大きさしかありません。
string readData = dc.readData;
等とした場合、参照値の代入だけが行なわれます。
int a=b;
と、整数型の変数を用意した代入するのと、ほとんど変わりません。
各方式で違いが出るのは、変数用の領域に使われれる数バイト程度でしょう。
No.1
- 回答日時:
WriteAllText?ReadAllText?両者が混在していますがどういう状況でしょうか。
out修飾子を使う事からReadAllTextだとは思いますが、結論から言うと①~③どの方法で実装しても大してメモリ使用量は変わりません。
ただし、1カ所しか呼び出さないという条件を付けると①<③<②となります。
①と③は厳密にはわかりませんが数kb未満、③と②では32bitまたは64bitメモリ消費が増えます。
一方で複数個所から呼び出す、かつ、一度読みこんだデータを使いまわす様な実装の場合は、②が最もメモリ消費が少ない、かつ、動作が高速になる可能性が高いです。
もっと根本的な事を言うとReadAllTextやWriteAllTextは好ましくないと言う事です。FileStreamを使った方が良いでしょう。
ReadAllTextやWriteAllTextはプログラム側の都合や、ストレージ側の都合を考えずにメモリからストレージ、ストレージからメモリへと一括読み書きしてしまします。
ファイル全体を一度にメモリ展開したり、メモリにファイルの内容全部がそろわないとストレージに書き込めません。
また、ストレージ側の準備が整うまで何秒待たされるかも不明です。(ネットワークストレージとかだと最長で1分とか)
一方でFileStreamはファイルの一部分でもプログラム側の都合がよくなった時点で読み書きができますし、
読み書きの成否はストレージ側の都合を待って別スレッドで受け取れる仕組みがあります。
インライン実装かクラス実装かでのメモリ消費の差を気にするよりもっと根本的なファイル操作ロジックのメモリ消費の方を意識した方が良いでしょう。
回答ありがとうございます。
説明が分かりづらく、すみません。
関数役割として、program関数は書き込み、dataRead関数は読み込み、という立ち位置で、dataRead 関数で読み込んだデータを受け取って、program関数で書き込む、という仕組みになります。
本件の質問意図としては、①~③のパターンで、読み込みデータ値が占めるメモリ使用量の増加有無に関するものになります。
①dataClassのメンバ変数値を直接使っているので、オブジェクトを作ってないと思いますが、メンバ変数値分のメモリ使用量増加はあるの?
②明確にdataClassのメンバ変数値を持つオブジェクトを作っているので、やはりメモリ使用量増加はデータ量に応じてあります?
③dataClassのメンバ変数がmain関数にお引っ越し、の形になるので、読み込みデータによるメモリ使用量は1つ分?
といった具合になります。
ファイル読み込みはusingで回したりなども考えてはいるので、ひとまず流してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
VB.netでUSBメモリの固有I...
-
大容量のメモリ確保をスワップ...
-
計算速度が遅い
-
C言語で、メモリを解放しないで...
-
EXCEL-VBAにてADOのレコードセ...
-
C#で別クラスインスタンスのメ...
-
バッチファイルでの実行EXEのメ...
-
メモリ不足
-
ルネサスマイコン(R8C) ビルド...
-
VBAの配列サイズとメモリに関して
-
imagedestroyしないとどうなる?
-
動的確保できるメモリ容量
-
VB2005 Datagridview の仮想モ...
-
プログラム領域の算出方法
-
Macターミナルで実行中のプログ...
-
VBAで別プロセスのExcelのフル...
-
VC++2010 TCPIP通信の受信処理...
-
Mac 乗数の入力方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
Access Violationについて
-
VBAの配列サイズとメモリに関して
-
メモリのセグメント違反の解決...
-
メモリが不足しています(VBA)
-
メモリ不足
-
大容量のメモリ確保をスワップ...
-
ファイルマッピング関数で失敗
-
PC-98で拡張メモリを使え...
-
エラーについて
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
オフスクリーンサーフェスへの...
-
1ページに収まるオブジェクト...
-
新規購入PCのスペックについて...
-
4GB搭載したマシンのメモリ情...
-
組み込み系でのmallocについて
-
ルネサスマイコン(R8C) ビルド...
-
Visual Basic Net2003
おすすめ情報