掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
テキストファイルから一行ずつ表示させるには? (ID:116300)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>Preserve で配列の要素数だけコピー処理が発生して遅くなる という書き込みがある事は知っていますが、まさかそこまではという気がします。 この件については以前かなり突っ込んだ事があります、やってみると判るのですが Private Declare Function timeGetTime Lib "winmm.dll" () As Long Dim a() As String Private Sub Command1_Click() Dim t As Long Dim n As Long ReDim a(10000) 'はじめに確保 t = timeGetTime For n = 1 To 10000 a(n) = String(500, "A") 'Aを500個配列に Next Debug.Print timeGetTime - t t = timeGetTime ReDim a(0) For n = 1 To 10000 ReDim Preserve a(UBound(a) + 1) '一回づつ確保 a(n) = String(500, "A") Next Debug.Print timeGetTime - t End Sub とやると結果は 31(msec)と94(msec)となり気になる程の差は出ません。 ただしループを10,000から100,000に増やすと私の環境ですが77,481回目で ReDim Preserve a(UBound(a) + 1)の方はメモリーが足りない というエラーメッセージが出ます。不思議なことにスワップが出来ないのです。 変です、なんとなくVBのバグの匂いがします。 そこで配列が足りなくなったらまとめて増やすという方法をとってみます これだと時間も45(msec)とそこそこですし100,000回でエラーも出ません。 1,000,000まで増やしました、73秒かかりましたがエラーは出ません。 大きなデーターを配列に入れたい人にはお勧めかもしれません。 Dim t As Long Dim n As Long ReDim a(0) t = timeGetTime On Error GoTo e For n = 1 To 10000 a(n) = "" 'エラーを出させてまと確保 a(n) = String(500, "A") Next Debug.Print timeGetTime - t Exit Sub e: ReDim Preserve a(UBound(a) + 100) '100個分確保 Resume Next 上のプログラムを実行するとプログラムを停止後、他のプログラムを起動する時 スワップの領域開放の為かハードディスクに激しくアクセスします、ほっておけば 終わります。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.