DOBON.NET DOBON.NETプログラミング掲示板過去ログ

CSVファイルを配列に格納について

環境/言語:[XP, vb2005]
分類:[.NET]

はじめて投稿させて頂きます。

.NET Tips の「CSVファイルを配列に格納」を
使用させて頂いているのですが、速度の関係で悩んでいます。

郵便番号のCSVファイル(12万件)ほどで、30秒ですが、
300万件のデータの場合、膨大な時間が掛かってしまいました。
(途中で断念してしまい、正確な時間はすみません)

この処理を高速に行えるようにしたいです。
DBを使用する方法もありますが、よろしくお願いいたします。

CPU Celeron 1.7GHz
メモリ 736mb

Dim csvRecords As New System.Collections.ArrayList()

Dim csvFileName As String = "KEN_ALL.CSV"
Dim tfp As New FileIO.TextFieldParser(csvFileName, _
System.Text.Encoding.GetEncoding(932)) tfp.TextFieldType = FileIO.FieldType.Delimited
'区切り文字を,とする
tfp.Delimiters = New String() {","}
tfp.TrimWhiteSpace = True

While Not tfp.EndOfData
Dim fields As String() = tfp.ReadFields()
csvRecords.Add(fields)
End While

tfp.Close()
■No22625に返信(nimarさんの記事)
>郵便番号のCSVファイル(12万件)ほどで、30秒ですが、
>300万件のデータの場合、膨大な時間が掛かってしまいました。
>(途中で断念してしまい、正確な時間はすみません)
単純計算でも12分30秒は掛かる計算になりますが、何分
待ったのですか?
■No22626に返信(るしぇさんの記事)
> ■No22625に返信(nimarさんの記事)
> >郵便番号のCSVファイル(12万件)ほどで、30秒ですが、
> >300万件のデータの場合、膨大な時間が掛かってしまいました。
> >(途中で断念してしまい、正確な時間はすみません)
> 単純計算でも12分30秒は掛かる計算になりますが、何分
> 待ったのですか?

1時間程、待ちました。
その際、ArrayListのcountは、170万ぐらいでした。

取得して格納しているだけですが、
これに、値の判定(検索機能)が付くと、さらに掛かりますよね。。。
■No22631に返信(nimarさんの記事)
>郵便番号のCSVファイル(12万件)ほどで、30秒ですが、
>300万件のデータの場合、膨大な時間が掛かってしまいました。

300万件のデータを配列に入れる理由は何でしょう?

理由によっては別案も考えられますし、現状では
そもそも仕様を見直した方がいいような気がしますが・・・
> 郵便番号のCSVファイル(12万件)ほどで、30秒ですが、
> 300万件のデータの場合、膨大な時間が掛かってしまいました。
> (途中で断念してしまい、正確な時間はすみません)

1レコードのサイズはどれくらいですか?
仮に1Kbyte(半角1000文字)で約3GBの容量になります。
10分の1で考えても約300MBですから、
WindowsXPでメモリ736MBのマシンで全部オンメモリで処理すると
スワップが発生し続けて使い物にならないのでは?

> この処理を高速に行えるようにしたいです。

メモリ上に保持するのは処理に必要な最小限(の何倍か)の量として、
小さな単位で処理を行い、処理済み分から順次、処理結果をファイルへ書き出し行くとよいと思います。

DOBON.NET | プログラミング道 | プログラミング掲示板