並列処理でファイルを読み込むには?

解決


るどるふ  2005-02-18 04:11:27  No: 119752

こんにちは、

今の所、APIを使い、
CreateFile(FileName1, &H80000000, 1, 0, 3, 0, 0)
xxx = ReadFile(hFile1, Buf(0), BufSize, 0, 0)
の様な感じにファイルを読み込んでいます。

このファイルを読み込むのを、
この後の処理と並列に処理するようにしたいのですが、
どうすれば良いのか分かりません。

CreateFile の第六引数を &H40000000 にしてみたり、
CreateFileEx を使ってみたりしたのですが、
ファイルを読み込むことが出来ませんでした。

別案として、読み込み処理を ActiveX.exe にして、
その中で、タイマーを使い、
読み込み処理を呼び出す事を考えているのですが、
これで並列で処理出来るようなのですが、
読み込んだデータをメインプログラムに返す、
適切な方法が分かりません。
数十MB有る配列データを高速に渡したい場合、
どういった方法が良いのでしょうか?


ねろ  2005-02-18 06:23:03  No: 119753

メモリーマップ、CreateFileMappingかな、
やりたいことが今ひとつわからないが。
>このファイルを読み込むのを、
>この後の処理と並列に処理するようにしたいのですが、
ここの所がさっぱり。


るどるふ  2005-02-18 07:39:20  No: 119754

ねろさんありがとうございます。

書き方が悪かったのですが、
なるべくならば、別案は使わず、
ファイルの読み込みを並列処理で行いたいです。
ファイルの読み込みには時間が掛かるので、
その間に他の処理をしたいのですが、
うまくいきません。

メモリーマップ、CreateFileMapping  について、
これから調べてみます


るどるふ  2005-02-18 09:01:30  No: 119755

ちょっと調べてみたのですが、
私が調べた範囲では、CreateFileMappingは既存のファイルやページングファイル上を、
擬似メモリーの様にアクセスする為のAPIのように感じたのですが、
そうだとすると、実際にはメモリー上や配列に読み込んでいるのではなく、
受け渡しに使ったとしても、メインプログラムで直接読みながら処理するのと
速度的には変わらない(処理が増えるので逆に遅くなる?)
ように感じるのですがどうなんでしょうか?


ねろ  2005-02-18 17:03:31  No: 119756

>私が調べた範囲では、CreateFileMappingは既存のファイルやページングファイル上を、
>擬似メモリーの様にアクセスする為のAPIのように感じたのですが、
逆です、調べ方が悪いですね。(^^;
CreateFileMappingを使用する『メモリマップドファイル』は、その名の示す通り、
メモリー空間にファイルをマッピングする関数です。
読み込まれたデーターはメモリー上にありながら、ファイルの様に扱うことが
可能です。こうすることにより、プロセス間でメモリーの共有が可能となります。


ひろ  2005-02-18 19:16:02  No: 119757

非同期I/Oを使えば別プロセスにしなくてもいい話では?


ねろ  2005-02-18 20:14:02  No: 119758

書き方からしてVB6だと思ったのですが、
VB6で非同期I/Oはちょっと。。。。


ひろ  2005-02-18 21:10:30  No: 119759

>書き方からしてVB6だと思ったのですが、
>VB6で非同期I/Oはちょっと。。。。

肝心なこと書いていませんでした。

非同期I/Oの処理は全部C++で書いたDLLでラッピングして使ったのでV
B6からは単なるDLLの呼び出しに見えるようにしていました。

非同期I/OのAPIを直接VB6で使ったことはありません。

(でも、マルチスレッドとは違うのでマルチスレッドのAPIを呼ぶよりは
  安全な気がしますが)


るどるふ  2005-02-19 05:15:59  No: 119760

ねろさん、ひろさん、何度も書き込み有難うございます。
ちゃんと明記していなかったのですが、推測の通りVB6を使っています。
.net なら出来るのでしょうか?

>逆です、調べ方が悪いですね。(^^;

確かに逆でした。
これなら高速にデータの遣り取りが出来そうです。

>非同期I/O

これは、CreateFile で非同期を指定したり、
CreateFileEx ということで良いのでしょうか?
一応自分なりに試してはみたのですが、
VBでのサンプルプログラムや解説を見つけることが出来ず、
どういう引数を渡したら良いか分からず、
旨く行きませんでした。
それ以前に、VBでの非同期I/Oが可か不可かという
ハッキリした情報も見つけられませんでした。
(曖昧な表現は有ったのですが)
結局の所、不可能なのか、不安定で信頼性に欠けるのか、出来るけど難しいのか、
VB6での非同期I/Oは、これらのどれに当たるのでしょか?


。。。  2005-02-19 06:09:32  No: 119761

>xxx = ReadFile(hFile1, Buf(0), BufSize, 0, 0)
非同期処理にしたいのなら最後の引数(LPOVERLAPPED)に0(NULL)を渡すのはまずいでしょう。


るどるふ  2005-02-23 07:55:07  No: 119762

。。。さん  有難うございます。
OVERLAPPED構造体を渡してみたのですが、
バッファにはデータが入って来ませんでした。
引数等に問題が有ったのかもしれませんが、
VB6で、CreateFileで非同期を指定してReadFileで読み込む様な情報を、
ネット上で見つける事も出来なかったので、
この方法での非同期読み込みは(能力的に?)出来ないということで、
(可能なのか不可能なのかだけでも、知りたいのですが・・・)
この方法は諦め、ActiveXを使って実現しようと思います。

助言くださった方々、有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加