はじめまして。
初投稿の新米プログラマです。
VB6.0で多種類のファイルをバイナリデータとして読み込んで
返却する関数を作成しています。
'-------------------------------------
' ファイルからバイナリデータを読み込む
'-------------------------------------
private Function GetBinaryData(ByVal strFileName As String) As Byte()
On Error GoTo Exception
Dim fileNo As Integer
Dim fileSize As Long
Dim bytData() As Byte
'ファイルのサイズを取得する
fileSize = FileLen(strFileName)
ReDim bytData(fileSize - 1)
'バイナリデータ読み込み
fileNo = FreeFile
Open strFileName For Binary Access Read As fileNo
Get #fileNo, , bytData
Close #fileNo
'戻り値の設定
GetBinaryData = bytData
Exit Function
'エラー処理
Exception:
MsgBox (CStr(Err.Number) & " " & Err.Description)
End Function
ですが、↑の関数にサイズの大きなファイル(100M程度)を指定したとき
ReDim bytData(fileSize)
で、「メモリが不足しています」というエラーが発生してしまいます。
発生の仕方としては、'エラー処理のMsgBoxで表示されることも
ありますし、プログラムが停止することもありますし、
On Error GoToを記述しているのにも関わらず
VBのメッセージボックスが表示されることもあります。
#[継続][終了][デバッグ][ヘルプ]のボタンが出ているやつです。
ちなみに、50M程度のファイルであれば読み込めています。
このエラーが発生する原因は何なのでしょうか?
また、解決方法(サイズの大きなファイルを確実に読み込む方法)は
あるのでしょうか?
解決方法がないのであれば、「○M以上のファイルはエラー」という
仕様にしようと思うのですが、
何Mまでなら確実に読み込むことが出来るのでしょうか?
…もしくは上のコーディング自体、検討違いでしょうか^^;
#バイト配列の要素数に上限があるとか…?
とても困っています…
どうかよろしくお願い致します。
No.1ベストアンサー
- 回答日時:
実行環境に依存するようにも思えます
当方で単に確保するのみの確認したところでは ReDimで340MB程度は確保できるようでした
関数が配列を返す場合一時的に内部で使用しているローカル変数と呼び出し元の受け手の配列の2つ領域で同じ大きさの配列が必要になると思われます
ファイルの読み込みを 1度にしないといけないのでしょうか
50MB程度のバッファを用意して読み込み、必要な処理を行い
次ブロックを読み込んで、必要な処理
といったループを組めば済むように感じます
終端処理のため処理したByte数の管理は必要でしょうが …
LOF関数やLOC関数などを使って残りがいくつあるかは確認可能です
回答ありがとうございました!
こちらでも調べてみたところ、どうやら配列を宣言するとき
メモリに配列の要素数分の「連続したエリア」がないと「メモリ不足」になるらしい、です。
http://chaichan.web.infoseek.co.jp/vbtips/VBMemo …
断片化したメモリをかき集めて作ってはくれないのですね…。
なので
>実行環境に依存するようにも思えます
というのは、おっしゃる通りでした。
>ファイルの読み込みを 1度にしないといけないのでしょうか
ファイルの読み込み自体を一度にする必要はないのですが、
最終的に1つのバイト配列に格納しなければいけないのです…。
結局、「最終的に1つのバイト配列に格納しなければいけない」という状況から
「サイズの大きなファイルを確実に読み込む方法」は「無理!」という結論に至りました。
その状況がなければredfox63さまの回答の通りだったと思います。
ありがとうございましたm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
VB6のメモリ解放に関して
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBから参照できないCのDLLを使...
-
access テキストボックスの値取得
-
PowerShellを使って関連付けら...
-
fgets関数のEOFの扱い方について
-
エクセルマクロでエラーの原因...
-
gccを行ってもexeファイルが生...
-
インプットボックスからファイ...
-
【COBOL】read文でエラー
-
VB6 Dir関数で52エラー発生
-
FileSearchがExcel2010でできない
-
VBでファイルが開かれているか...
-
エラー:インクルードファイル ...
-
郵便番号を表示させる関数のエ...
-
Request.BinaryReadでのエラー
-
「複数の選択範囲に対して実行...
-
excel VBA webからデータを取り...
-
【VB6.0】ファイルからサイズの...
-
NAS上のファイルの使用中が解除...
-
Access2002でモジュールを開く...
-
FTPの送信結果を検知したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルマクロでエラーの原因...
-
access テキストボックスの値取得
-
Returnに対するGoSubがありません
-
batファイルでレジストリキーの...
-
VBから参照できないCのDLLを使...
-
「パス名が無効です」の発生原因
-
PowerShellを使って関連付けら...
-
FTPの送信結果を検知したい
-
NAS上のファイルの使用中が解除...
-
VBでファイルが開かれているか...
-
VB6 Dir関数で52エラー発生
-
ExcelVBAで既に開いてるwordを...
-
gccを行ってもexeファイルが生...
-
EXCELのVBAでWORDが開いてある...
-
アクセスのクエリでコンパイル...
-
【COBOL】read文でエラー
-
Vba ファイル書き込み時に書き...
-
FORTRANの実行エラーについて
-
「複数の選択範囲に対して実行...
-
fgets関数のEOFの扱い方について
おすすめ情報