No.1ベストアンサー
- 回答日時:
CSVなどのファイルを開く場合は、基本的に
fopen関数
file関数
file_get_contents関数
ぐらいになると思いますが、
file関数はすべての行を配列に落とすため、メモリが一気に使用されます。
file_get_contentsもすべてのデータを取得して何らかの変数に代入するので、
配列ほどではないにしても一度にメモリを消費すると思います。
また、一度に巨大なデータを一気に取得して何らかの展開を行う方法では高速化はされませんので、
fopen関数を使い、whileなどでループさせながら、fgets(fread)関数で一行ずつ読み込みを行う、という方法になると思います。
そうしますと次に考えるのは、検索で一致した行を探すという内容ですが、
これは要件次第ですのでなんとも言えませんが、
fgetsしてきた一行から文字列を検索する方法で一番早いと思われるのは、strpos関数ですが、マルチバイトに対応していない為、今回は使えません。
mb_strpos関数もありますが、mbの類は結構遅いです。
なので、preg_matchを使用するのが一番早いと思います。
そして、preg_matchで適合したもののみ、配列などに代入していくと。
長々とここまで書きましたが、それでも速度に問題があるなら、データベースにデータを移して、SQLで検索をかけた方が良いと思います。
詳しい回答ありがとうございます。
やはりfopen関数になりますか。file関数はメモリを食う原因なので、私も使用はないかなぁ〜と思っています。内容に合致した1行を抽出するには、やはりfopen関数がもってこいですね。
私が気になっていたのはこのマルチバイトの扱いですが、ここはpreg_matchですか。とても参考になりました。
No.4
- 回答日時:
fopen()でファイルオープンしてでfgets()で取得して利用時にCSVをexplode()やstr_getcsv()で分割するなら
fgets()の代わりにfgetcsv()を使って取得時に配列に分離してしまった方が良いと思いますよ。
No.2
- 回答日時:
CSVファイルをパースしたあとにDBに突っ込んで検索させる。
CSVファイルを更新した場合には自動的にDBに保存しなおしさせるように仕込んでおく
次からはDBを読みに行けばいいだけ。
CSVが頻繁に更新されるのであれば、memcacheなどを使ってメモリに展開させておくかな。
いずれにせよ、ファイルを直接ずるずる引きずりまわすのはメモリも食うし何しても結果的に満足いく速度は出ない。
ご回答ありがとうございます。
なるほど、元のCSVファイルを更新するたびにDBに突っ込んでおくんですね。となると、検索はPHPでやるのでなく、DBに任せておくのが無難ですか。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
ファイルをメモリに出力する方法
-
DXFファイルをVBで取り込み、図...
-
[VBS] 16進数でバイナリファイ...
-
グレースケール画像の画素値を得る
-
SDKにて。
-
VBSにてCSV読み込みし比較
-
VBAでテキストファイルの改行を...
-
Excel VBAで画像解析
-
インデックスが配列の境界外で...
-
ファイル読み込みと構造体について
-
テキストファイルを後ろから読...
-
RGBのバイナリデータをCImageに...
-
ファイルのアクセス回数について
-
エクセルのプロパティーでセキ...
-
エクセルvbaでdocuworksprinter...
-
frxファイルの役目
-
エクセルで複数のコメントのサ...
-
エクセルVBAで一つ上の階層...
-
Windows10でコマンドプロンプト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
Cで2次元配列にCSVファイルを...
-
DXFファイルをVBで取り込み、図...
-
RGBのバイナリデータをCImageに...
-
バイナリファイルでOutOfMemory...
-
テキストファイルを後ろから読...
-
VBAでテキストファイルの改行を...
-
[VBS] 16進数でバイナリファイ...
-
ファイル入力のデータを構造体...
-
VBScriptの配列は、要素数を指...
-
C言語でのファイル読み込み
-
ファイルからビット単位での読...
-
グレースケール画像の画素値を得る
-
bmpファイルの明暗の数値化の方法
-
Excel VBAで画像解析
-
awk getlineをもう一度ファイル...
-
日本語混じりのファイルをラン...
-
CSVファイルによる検索の高速化
-
VBSにてCSV読み込みし比較
-
VBAでテキストファイルを複数開...
おすすめ情報