
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ランキング
-
ファイル内の(&H0A)を(&H0D0A)...
-
バイト型のデータを16進表記で...
-
日本語混じりのファイルをラン...
-
エクセルのプロパティーでセキ...
-
パワーポイントの文字数
-
エクセルvbaでdocuworksprinter...
-
エクセルで複数のコメントのサ...
-
動かなくなってしまった古いVBA...
-
ファイルサーバ上のファイルが...
-
frxファイルの役目
-
Excel 相対パス
-
同じファイル名 上書きしないフ...
-
実行ファイルのパスを取得したい
-
ファイル名と同名のフォルダを...
-
エクセルのハイパーリンクがコ...
-
開いているファイルを削除し、...
-
ExcelブックをGoogleスプレッド...
-
カンマ区切りのCSVファイルから...
-
複数のテキストファイル内の複...
-
Excel csv保存 列数が異なる場...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルを後ろから読...
-
DXFファイルをVBで取り込み、図...
-
ファイル入力のデータを構造体...
-
バイト型のデータを16進表記で...
-
バイナリデーター内の文字を検索
-
ファイルの読みこみ方法とファ...
-
VBScriptの配列は、要素数を指...
-
フォートランのソース変更を試...
-
txtファイルの数字を計算
-
CSVファイルによる検索の高速化
-
日本語を配列に収め、そして表...
-
ファイルをメモリに出力する方法
-
RGBのバイナリデータをCImageに...
-
データグリッドビューの一覧に...
-
C or C++で2次元のデータの並び...
-
Cで2次元配列にCSVファイルを...
-
VBAでテキストファイルを複数開...
-
バイナリ出力
-
バイナリファイルでOutOfMemory...
-
バイナリファイルの一部分をカ...
おすすめ情報