
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- PDF AutoCAD図面をPDF fileに変換した際、画像情報やブロック名はわかるのでしょうか。 1 2022/06/03 09:42
- iOS ファイルの名前変更 2 2022/08/11 20:47
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 数学 数学についての質問です。 変化の割合の公式の a=yの増加量/xの増加量 は一次関数に使えるのは知っ 2 2022/05/08 16:20
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++のスタック管理
-
main関数内のローカル変数につ...
-
PIC 文字 を 数値に 変換
-
「ヒープサイズの設定」て何?
-
関数内でVirtualAllocで確保し...
-
C言語における再帰呼び出しの...
-
C#で別クラスインスタンスのメ...
-
シェル(perl)が使用するメモリ...
-
動的メモリとexit(C言語)
-
C言語をサーバーサイドにするメ...
-
非再入可能なプログラム
-
変数をあなたの身近なものに例...
-
GetAdapterInfoによりマックア...
-
H8 マイコン セクションの設...
-
vbsのプログラム
-
これて逆じゃないですか?
-
LoadLibraryしたらFreeLibrary
-
メモリアロケーション異常の発...
-
「memcpy」と「strcpy」について
-
EXCEL-VBAにてADOのレコードセ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリ不足
-
メモリが不足しています(VBA)
-
「ヒープサイズの設定」て何?
-
メモリのセグメント違反の解決...
-
バッチファイルでの実行EXEのメ...
-
VB.netでUSBメモリの固有I...
-
EXCEL-VBAにてADOのレコードセ...
-
エクセルのメモリ使用状況/Appl...
-
「memcpy」と「strcpy」について
-
エクセルVBA 大容量CSVファイル...
-
ファイルマッピング関数で失敗
-
大容量のメモリ確保をスワップ...
-
GetAdapterInfoによりマックア...
-
C言語における再帰呼び出しの...
-
C++のCopyFileでメモリが増える
-
メモリを解放しないとどうなる?
-
クリスタルレポートでメモリ不...
-
closeとメモリの開放について
おすすめ情報