
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
数値から画像を作りたい
-
バイナリファイルでOutOfMemory...
-
CFileの使い方を教えてください
-
VBSにてCSV読み込みし比較
-
RGBのバイナリデータをCImageに...
-
Excel VBAで画像解析
-
ファイル内の(&H0A)を(&H0D0A)...
-
エクセルのプロパティーでセキ...
-
エクセルで複数のコメントのサ...
-
ファイルのアクセス回数について
-
エクセルvbaでdocuworksprinter...
-
カンマ区切りのCSVファイルから...
-
ExcelブックをGoogleスプレッド...
-
ファイルサーバ上のファイルが...
-
Wordで差込印刷した後に別々の...
-
エクセルVBAで一つ上の階層...
-
マクロから出力されるcsvのダブ...
-
エクセルのハイパーリンクがコ...
-
[エクセル]コピーするとオブジ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
RGBのバイナリデータをCImageに...
-
DXFファイルをVBで取り込み、図...
-
バイナリファイルでOutOfMemory...
-
VBScriptの配列は、要素数を指...
-
テキストファイルを後ろから読...
-
ファイル入力のデータを構造体...
-
awk getlineをもう一度ファイル...
-
インデックスが配列の境界外で...
-
ファイルをメモリに出力する方法
-
配列操作について
-
VBAでテキストファイルの改行を...
-
バイナリファイルの一部分をカ...
-
バイナリ出力
-
bmpファイルの明暗の数値化の方法
-
Excel VBAで画像解析
-
CSVファイルによる検索の高速化
-
日本語混じりのファイルをラン...
-
VB6.0 MSFlexGridのMouseRowプ...
-
ファイル内の(&H0A)を(&H0D0A)...
おすすめ情報