人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【VB6】ファイルIOについて質問です。ファイル出力する際にメモリにデータを詰込みます。
メモリには使えるだけ詰込んでもうこれ以上はいらない!というところまで積み込み続け、
一気にファイルに書き込みたいと思っているのですが、できますか?

空想の狙いは速度アップです。
アドバイス宜しくお願いします。

●質問者: harunoharuno
●カテゴリ:コンピュータ インターネット
✍キーワード:vb6 アドバイス データ ファイル メモリ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● heke2mee
●150ポイント ベストアンサー

コメント欄が開いてないので、こちらで失礼します。


配列にデータを入れて最後にループで書き出すだけじゃないかな


このようにバッファサイズも指定できますが、どれぐらい効果があるか分かりません。

open "c:\test.txt" for output as #1 len = 32000 (最大値は 32,767だったはず)


書き込みの速度が原因ではなく、文字列の連結などで遅くなってませんか?


文字列の連結

http://blogs.wankuma.com/rti/archive/2007/01/08/55000.aspx



こちらも参考になるかも

open 書き込みバッファのデフォルトサイズ

http://bbs.wankuma.com/index.cgi?mode=al2&namber=4337&KLOG=14


2 ● ardarim
●100ポイント

VB上からは直接そういうことを行うことは出来ません。Windows上で動作するアプリケーションの場合、確保したメモリはアプリケーションの意図によらずOSの判断で随時調節され、ページファイルに自動的にスワップアウトされます(オンメモリではなくなる)。


これを防止するには、VirtualAlloc APIでメモリを確保し、VirtualLock APIでロックする必要があります。VirtualLock APIでロックされたメモリはOSによってスワップアウトされることがなくなり、常にオンメモリ操作を行うことが出来ます。VB上からはこれらのAPIを直接呼び出す必要があります。

参考:VirtualAlloc [WinAPI Database for VB Programmer] VirtualLock [WinAPI Database for VB Programmer]


ただし、アプリケーションによってロックされたメモリはOSが最適な状態で利用することができないためシステム全体のパフォーマンスが落ちる可能性があります。またそのためにアプリケーションがロックできる最大サイズ(最大ワーキングセットサイズ)はあらかじめ決めれられていて、そのサイズを超えてはロックすることが出来ません。SetProcessWorkingSetSize APIを使って最大ワーキングセットサイズを変更することが可能です。

また最大ワーキングセットサイズを増やした場合でも、32bit Windowsの場合はアプリケーションが利用できる仮想アドレス空間の上限(2GB)を超えることは出来ません。

参考:32ビット WindowsOSでの仮想メモリの制限について(PDF)


3 ● khazad-Lefty
●75ポイント

一応、WshのWriteメソッドで書き込み自体はできると思います。

http://msdn.microsoft.com/ja-jp/library/cc428091.aspx

ただし、VB6の場合、文字列連結はコストが高いし、「データを積み込む」よりはその都度書き込むほうがスピードは期待できる気がします。

(要するにパフォーマンスを考えるとかえって良くない)そのあたりは回答1,2を参照ということで。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ