VB5プログラムをWin98で実行すると極端に遅くなる問題の解決方法

このQ&Aのポイント
  • 大量のCSVデータを配列に読み込むVB5プログラムをWin98で実行すると、読み込み速度が極端に低下します。
  • Win2kやWinXPでは問題なく動作するが、Win98では2時間半もの時間を要するため、解決策を求めています。
  • 問題の原因はWin9×とWinNT系OSのメモリ管理の違いによるものと推測されます。VB5プログラムで配列を宣言する方法や他のメモリ格納方法についても教えていただきたいです。
回答を見る
  • ベストアンサー

VB5にてコンパイルしたプログラムをWin98にて実行すると極端に遅くなるのを何とかしたい

長文で申し訳ないのですが、かなり困っており、Microsoftにもインシデントを 発行して調査依頼しております。その部分を抜粋して掲載します。 何でもいいので何か教えて頂けると幸いです <プログラム概要> 大量CSVデータ(複数ファイル合計約100MB)を配列に読み込み、その配列を使用してプログラムを 動作させるが、テキストデータ読み込み時に途中から急激に速度が低下する。 Win2kやWinXPマシンでは問題なく動作し、約数2分半で読み込み処理が終了するが、 Win98マシンでは読み込み処理が終了するまでに2時間半を要する。(Pen(4) 実メモリ256MB) <プログラム詳細>   ReDim gtypCDRコメント(30000)   intFileNumber = FreeFile ' ***ファイルOPEN***** Open CstrCsvPass & gstrファイルCD & CstrCDRコメント For Input As #intFileNumber lngDataCnt = 0 Do While Not EOF(intFileNumber) With gtypCDRコメント(lngDataCnt) Input #intFileNumber, .gstr健診種別, .gstrセットコード, _ .gstr短文, .gstr略文, .gstr長文1, .gstr長文2, .gstr長文3 lngDataCnt = lngDataCnt + 1 End With DoEvents Loop ' ***ファイル閉じる****   Close #intFileNumbe <質問内容> 上記現象は、大量データをメモリに格納するWin9×系OSとWinNT系OSの仕組みの違いに よるものではないかと推測しているが、ユーザへの説明上、OSにより上記の動作が異なる 理由をご回答頂ければ幸いです。 また、VB5プログラムをWin9×系OS上にて動作させる際に、上記配列の宣言 方法では読み込みデータサイズの推奨上限値がどの位になるのか、また別の メモリ格納方法であれば更に大きなサイズのデータをメモリに格納できるなど、 回避策は存在するのかご回答頂ければ幸いです。

  • umeum
  • お礼率68% (22/32)

質問者が選んだベストアンサー

  • ベストアンサー
  • mld_sakura
  • ベストアンサー率20% (264/1282)
回答No.1

このレベルになると、普通DBを使用するのが当然と思われます。 CSV等のテキストではどのようにやっても無理でしょう。

umeum
質問者

お礼

回答ありがとうございます。 そうですよねぇ。。 でも、DBを使ってはいけないという仕様なんです。 いや、CDRより起動するシステムでディスクを使用 してはいけないという仕様なんです。 何度も無理だとは言っているんですが。

関連するQ&A

  • VB6のプログラムをWIN7で使いたい

    OSをXpからWIN7に移行しなければならなくなり、環境移行のテストをしています。 VB6で組まれた業務用プログラムがあり、現在Xpで動作しています。 このプログラム自体はWIN97の時代に作成されたものです。 簡単に説明しますと、データがAccessのデータベースにあり、それを使って技術計算をするプログラムです。 WIN97に入れると、セットアップは成功するのですが、Accessとデータをやり取りする部分でエラーが起きているようです。 そもそも、VB6自体がWIN7にはセットアップできないようで、再コンパイルできません(再コンパイルで動くかどうかも不明ですが)。 WIN7上で動かす良い方法がないでしょうか。

  • VB6のプログラムの実行

    VB6で作成されて古いマシン(windows2000)で動作している プログラムをWindowsXP Service Pack3にコピーして実行 しようとすると起動時に以下のエラーが出て立ち上がりません。 ------------------------------------- 実行時エラー '5'; プロシージャの呼び出し、または引数が不正です ------------------------------------- http://support.microsoft.com/kb/811469/ja 上記HPの方法は試したのですが、ダメでした。 尚、ソースが無い為、どこで落ちてるか確認出来ません。 何か分かる所は無いでしょうか? (ちなみに基本的にVB6の動作って、OSの種類やバージョンや、 ServicePaceやWindowsUpdateに影響されると  考えてよろしいのでしょうか?)

  • VBプログラムについて

    テキストデータを取り込み、そのデータをもとに 表を作成し、Excelシートに出力するという VBプログラムをOS Windows2000、VB6.0(SP5)、Excel2000の環境で作成しました。 このプログラム(exe)をOS Windows95、Excel2000上で 動作するのでしょうか? また、動作させる場合にはどういった注意点が必要でしょうか? ちなみにそのプログラムではADO 2.6も使用しています。 どうぞよろしくお願いします。

  • VB 実行時エラー '3001'

    VB6.0(SP5)で開発していて、エラーが発生して困っております。 今まで使っていたプログラムにちょっとバグ改修をして、新しいバージョンのプログラムを配布したら、Win98マシンで何台か、次のエラーが出ました。 「実行時エラー'3001': 間違った種類または許容範囲外の引数を使用しているか、使用している引数が競合しています。」 プログラムは、「ログイン画面を表示し、IDとパスワードを入力し、DBに登録されているID&パスワードだったら実行」という処理をしています。DBはMySQLです。 エラーが出るマシンでは、このログイン画面(VBForm)が出る前に上記エラーを表示して、終了してしまいます。 ログイン画面を表示するまでの処理としては、 ・.iniファイルから各種パラメータを読み込んで変数にセット ・DBへの接続の文字列を作成する ・AdoConnectSetを実行 ・Formの各種プロパティを設定 ・FormのShowを実行 このような感じです。 そしてさらによくわからないのが、上記手順の合間合間に、MsgBox関数で「○○が終わった」などと、進行状況を表示する処理を追加すると、エラーが発生することなく、ログイン画面の表示までたどり着けるのです。 開発機はWin2000マシンですが、実行しているのはWin95,98,2000などいろいろで、上記のエラーが出るのは98マシンです。 (98マシンでちゃんと動作するのもあります) ズバリの解決法、情報へのポインタ、アドバイス、ヒント... を求めております。よろしくお願いいたします。

  • ファイル操作について

    すみません。初心者ながら質問させて頂きます。 開発環境はVC++.NETです。 現在、困っている部分を例に挙げて説明させて 頂きます。 例) CSVファイルから読み取ったデータが"123456789,1,1" があります。 上記のデータをある配列に格納します。 test[0]には、'123456789' test[1]には、'1' test[2]には、'1' ここまではすんなりできました。 問題はここからです。 test[0]のデータ('123456789')を 2バイト、3バイト、4バイトで 他の変数にデータを格納したいのです。 [格納変数] input1のデータ'12' input2のデータ'345' input3のデータ'6789' 上記のようなバイト分割は可能でしょうか? 以上です。 お手数ですが、アドバイス、ヒント、回答などを いただけたら幸いです。 宜しくお願い致します。

  • パーム、ザウルスなどでプログラム

    今、企画段階なんですが、パームやザウルス、WINCEマシンなどのモバイルマシンでメールを使ったゲームを考えております。 そこでいくつかわからないことがあるので、お教えください。すべての機種においての質問です。 1.上記のマシンで直接e-mailを受け取ることは可能か。 2.上記のマシンはeメールで添付ファイルを受け取ることができるのか? 3.上記のマシンでプログラムを趣味としている人がプログラムを作ることは可能か? 4.ゲームを作るとした際、画像データ含めどの程度のサイズまでが理想か。(内蔵のデータ用メモリを踏まえて) よろしくお願いします。 ちなみに自分がプログラムを組むわけではなく、プログラマを募集して組む予定なので、自分にはプログラムの知識はありません。 プログラムは組めませんが、コンピューターに関しては素人ではありません。 そのことを踏まえた上でお答えいただければと思います。

  • 【設計】vb.netでファイルを読み込みDB登録を行う

    すみません、vb.netで開発を行うにあたり設計に詳しい方が いらっしゃいましたらご教授願います。 開発する機能はタイトルの通り、txtファイルからデータを読み取り 内容をデータベースに登録するというものですが 現在、開発するにあたり二つのロジックを思いついており どちらが適切か迷っております。 (1) あらかじめtxtファイルの内容を全てリードし配列等の一時変数に退避   ファイルリード終了後、配列に格納されたデータを1件ずつ登録 (2) txtファイルの内容を1件リードするごとにデータベースに登録 開発環境は、vb.net、Oracle です。 txtファイルに格納されているデータ量はファイルにより様々ですが 多くても2万件が予想されます。 迷っている理由としては、 (1)は2万件のデータ量を配列に格納したとしてメモリが耐えれるかどうか? (2)は、1件ずつ読込みデータベースに登録するとなると  その分ファイル及びデータベースへのアクセス時間が長くなり  負荷がかかるのでは? という、懸念事項が考えられ迷っております。 上記、二つの開発手法の内どちらがベストか または、上記以外にベストなロジックがあればご教授お願い致します。

  • 実行後にコンパイルに失敗しましたってどういうことでしょうか。

    CPad for LSI C-86というC言語のフリーソフトのコンパイラーを使用しています。OSはWindows Vistaです。 #include <stdio.h> int main() { printf("Test Program") } という単純なプログラムを実行すると、「名前を付けて保存」になってしまい、適当にファイル名を付けて保存すると、 「コンパイルに失敗しました。ファイル”適当なファイル名”は存在しません。」 というコメントが表記されてしまって、プログラムの実行ができません。どなたか原因がわかる方、教えてください。よろしくお願いします。

  • とあるプログラムを教えてほしいのですが

    はじめましてこんばんは hommado と申します。 じつは先週の授業でこんな問題を出されたんですがもしできたらとあるプログラムを教えてほしいのです。 問題は 「キーボードから何階調にするのかを読み込むことで、入力画像LAX.bmpを任意の階調数に変換する」という プログラムです。 一応下に素体のプログラムをおいたんで、其のプログラムに何か付け足す感じでお願いします。「/*******↓基本的には、この範囲に画像処理プログラムを書く****/」から 「 /********↑**************************************************/」の中にプログラムを書くかんじなのでもし分かったら教えてください。お願いします。 あと何か他の所に付け足すようなところがあったら教えてください ここから元のプログラム // Bitmapファイルを読み込んで, // 別のファイルに出力するだけのプログラムです #include<stdio.h> #define XSIZE 256 /* 画像の横サイズ*/ #define YSIZE 256 /* 画像の縦サイズ*/ void main(void) { int x,y; char fni[40],fno[40]; /* 入力ファイルと出力ファイルの名前を格納するための配列*/ unsigned char head[1078],buf[YSIZE][XSIZE]; /* 入力ファイル(ビットマップファイル)のヘッダ情報と輝度値情報を格納するための配列*/ unsigned char in_image[YSIZE][XSIZE]; /* 入力画像の画素の輝度値を格納するための配列*/ unsigned char out_image[YSIZE][XSIZE]; /* 出力画像の画素の輝度値を格納するための配列*/ FILE *fp,*fp2; /* ファイルポインタ*/ printf("ファイル名を入れてください:"); scanf("%s",fni); fp=fopen(fni,"rb"); /* 読み込み& バイナリモードでオープンする*/ /* 配列head にビットマップファイルのヘッダ情報が格納されます*/ fread(head,sizeof(unsigned char),1078,fp); /* unsigned char 型のデータ×個を配列head に読み込む*/ /* 配列buf にビットマップファイルの輝度値情報が格納されます*/ fread(buf,sizeof(unsigned char),XSIZE*YSIZE,fp); for(y=0;y<YSIZE;y++){ for(x=0;x<XSIZE;x++){ in_image[y][x]=buf[y][x]; /* 画像の左下の画素が座標buf[0][0] です*/ } } printf("読み込み終了しました!\n"); printf("出力ファイル名を入れてください:"); scanf("%s",fno); /*******↓基本的には、この範囲に画像処理プログラムを書く****/       ここにプログラムを書いてください!      (もしここ以外で、他の所で付け足すプログラムがあったら何行目に       何を書くのかも教えてください) /********↑**************************************************/ fp2=fopen(fno,"wb"); /* 書き込み& バイナリモードでオープンする*/ /* 配列head の内容を出力ファイルに書き込む*/ fwrite(head,sizeof(unsigned char),1078,fp2); /* 配列out_image の内容を出力ファイルに書き込む*/ fwrite(out_image,sizeof(unsigned char),XSIZE*YSIZE,fp2); fclose(fp); /* ファイルをクローズする*/ fclose(fp2); /* ファイルをクローズする*/ printf("作業完了!\n"); }

  • プログラム言語の動的配列について

    動的配列という場合、配列のサイズがプログラム動作中に変化する、という意味でしょうか。 それとも、プログラム作成時に配列サイズが指定されておらず、外部のデータを読み込んでその時点でサイズが確定するという場合もあるかと思います。おなじことでしょうか。 なお、配列のサイズが指定されていないプログラムがあるとして、実行開始したあとから指定された配列サイズがメモリ容量とか制限によって上限値があるということにはなるかと思います。 また、大き目に配列を用意して実際に使用する場合、その一部しか使わないというのは通常のことだと思います。そのような場合は全く無関係だと思います。 データのサイズが違っても同じプログラムが使えるので1つ作ればあちこちに応用できることになると思います。このあたりのことがクリアになると同じことをするプログラムは1つだけあればいいということになります。 一応、C,C++,Fortran(77,95)という昔からある言語で、ということですが。 よろしくお願いします。

専門家に質問してみよう