
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を見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バイナリファイルでOutOfMemory...
-
DXFファイルをVBで取り込み、図...
-
エクセルのプロパティーでセキ...
-
エクセルvbaでdocuworksprinter...
-
xcopyコマンドの進行状況を表示...
-
ExcelブックをGoogleスプレッド...
-
ハイフネーションされている英...
-
Wordで差込印刷した後に別々の...
-
frxファイルの役目
-
カンマ区切りのCSVファイルから...
-
エクセルのハイパーリンクがコ...
-
【VBA】ExcelマクロでCSVファイ...
-
エクセルVBAで一つ上の階層...
-
VS2005で"定義へ移動"ができません
-
VB6でUTF-8ファイルの読取りを
-
ファイルサーバ上のファイルが...
-
[エクセル]コピーするとオブジ...
-
バッチファイルのコピーで
-
マクロから出力されるcsvのダブ...
-
EXCEL 検索時の設定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内の(&H0A)を(&H0D0A)...
-
バイナリファイルでOutOfMemory...
-
Cで2次元配列にCSVファイルを...
-
ファイルから構造体へデータを...
-
ファイル入力のデータを構造体...
-
RGBのバイナリデータをCImageに...
-
Mscomm を使用してバイナリでデ...
-
カウント数について
-
VB6.0 MSFlexGridのMouseRowプ...
-
テキストファイルを後ろから読...
-
DXFファイルをVBで取り込み、図...
-
C言語の問題です。
-
VBScriptの配列は、要素数を指...
-
VBAでテキストファイルの改行を...
-
ファイルからビット単位での読...
-
Unicodeのファイル読み込みがう...
-
バイナリ出力
-
インデックスが配列の境界外で...
-
配列操作について
-
CSVファイルによる検索の高速化
おすすめ情報