電子書籍の厳選無料作品が豊富!

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件)

まず、いずれの場合も、File.ReadAllTextによって、ファイルの全内容が格納されたStringのオブジェクトが作られます。


これは、どの方式を使っても同じです。

String型の変数は、そのオブジェクトの場所(参照値)を覚えるだけの大きさしかありません。
string readData = dc.readData;
等とした場合、参照値の代入だけが行なわれます。
int a=b;
と、整数型の変数を用意した代入するのと、ほとんど変わりません。


各方式で違いが出るのは、変数用の領域に使われれる数バイト程度でしょう。
    • good
    • 0

WriteAllText?ReadAllText?両者が混在していますがどういう状況でしょうか。


out修飾子を使う事からReadAllTextだとは思いますが、結論から言うと①~③どの方法で実装しても大してメモリ使用量は変わりません。

ただし、1カ所しか呼び出さないという条件を付けると①<③<②となります。
①と③は厳密にはわかりませんが数kb未満、③と②では32bitまたは64bitメモリ消費が増えます。
一方で複数個所から呼び出す、かつ、一度読みこんだデータを使いまわす様な実装の場合は、②が最もメモリ消費が少ない、かつ、動作が高速になる可能性が高いです。

もっと根本的な事を言うとReadAllTextやWriteAllTextは好ましくないと言う事です。FileStreamを使った方が良いでしょう。
ReadAllTextやWriteAllTextはプログラム側の都合や、ストレージ側の都合を考えずにメモリからストレージ、ストレージからメモリへと一括読み書きしてしまします。
ファイル全体を一度にメモリ展開したり、メモリにファイルの内容全部がそろわないとストレージに書き込めません。
また、ストレージ側の準備が整うまで何秒待たされるかも不明です。(ネットワークストレージとかだと最長で1分とか)
一方でFileStreamはファイルの一部分でもプログラム側の都合がよくなった時点で読み書きができますし、
読み書きの成否はストレージ側の都合を待って別スレッドで受け取れる仕組みがあります。

インライン実装かクラス実装かでのメモリ消費の差を気にするよりもっと根本的なファイル操作ロジックのメモリ消費の方を意識した方が良いでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
説明が分かりづらく、すみません。
関数役割として、program関数は書き込み、dataRead関数は読み込み、という立ち位置で、dataRead 関数で読み込んだデータを受け取って、program関数で書き込む、という仕組みになります。
本件の質問意図としては、①~③のパターンで、読み込みデータ値が占めるメモリ使用量の増加有無に関するものになります。
①dataClassのメンバ変数値を直接使っているので、オブジェクトを作ってないと思いますが、メンバ変数値分のメモリ使用量増加はあるの?
②明確にdataClassのメンバ変数値を持つオブジェクトを作っているので、やはりメモリ使用量増加はデータ量に応じてあります?
③dataClassのメンバ変数がmain関数にお引っ越し、の形になるので、読み込みデータによるメモリ使用量は1つ分?

といった具合になります。
ファイル読み込みはusingで回したりなども考えてはいるので、ひとまず流してください。

お礼日時:2018/08/08 09:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!