1.csvと2.csvのファイルから3.csvのファイルを作成したいのです。

1.csvの行数と2.csvの行数は同じ行数です。
下が自分で書いたもので、1.csvのファイルサイズが3MB程度なら難なく動いたのに、16MBですと以下の症状が出ます。
症状)3.csvを作成しはじめるのですが、途中で止まってしまいます。
どうかご教授お願いいたします。

1.csv
1,a-b-c-d,○○,△△,××
2,e-d,ああ,いい,うう
3,a-f-g,かか,きき,くく
4,h-i-d,ささ,しし,すす
5,j-d,たた,ちち,つつ

2.csv
1001-1002-1003-1004
1005-1004
1001-1006-1007
1008-1009-1004
1010-1004

3.csv
1,1001-1002-1003-1004,○○,△△,××
2,1005-1004,ああ,いい,うう
3,1001-1006-1007,かか,きき,くく
4,1008-1009-1004,ささ,しし,すす
5,1010-1004,たた,ちち,つつ


<?php

$fcat=fopen("1.csv","r");
$fcat2=fopen("2.csv","r");

touch("3.csv");
$fcat3=fopen("3.csv","w+");

while($aryDat=fgetcsv($fcat,10000,",")){

$aryDat[1]=trim(fgets($fcat2));
fwrite($fcat3,$aryDat[0].",");
fwrite($fcat3,$aryDat[1].",");
fwrite($fcat3,$aryDat[2].",");
fwrite($fcat3,$aryDat[3].",");
fwrite($fcat3,$aryDat[4]."\n");
}

fclose($fcat);
fclose($fcat2);
fclose($fcat3);
?>

回答の条件
  • 1人2回まで
  • 登録:2009/09/25 21:32:19
  • 終了:2009/10/02 21:35:02

回答(0件)

回答はまだありません

  • id:Mook
    >途中で止まってしまいます。
    とありますが、異常終了時の1.csv, 2.csv, 3.scv の行数はそれぞれ何行ですか?
  • id:miipa
    1.csv 17300行 で全て完了
    2.csv 17300行 で全て完了
    3.scv 13400行 で本来17300行まであるはず。
    という具合です。


  • id:Mook
    3.csv の方が、ソースデータより大きいのですか?

    途中で止まったという感じではないですね。
    逆をいえば、17300 行までは正しく処理されているのでしょうか。
    また、17300より後ろは何が入っているのですか?
  • id:miipa
    >3.csv の方が、ソースデータより大きいのですか?
    ソースデータは17300行あります。
    3.csvと中身の文字データなどはほぼ同じなので、ソースデータ、3.csvともデータサイズは16MB程度です。

    >途中で止まったという感じではないですね。逆をいえば、17300 行までは正しく処理されているのでしょうか。
    エラーメッセージは出ていません。
    しかし、エラーが発生していて出ていないのかわかりません。
    私の作ったphpによるプログラムは、実行すると順番にファイルが作成されていくのですが、質問に書いたように3MBのファイルですと、最終までファイルを作成して終わるのですが、16MBの場合、次のファイルが作成されずに止まってしまいます。
    その止まる位置が、3.csvの13400行辺りなのです。

    >また、17300より後ろは何が入っているのですか?
    何も入っていません。17300行で全て完了です。
  • id:HALSPECIAL
    HALSPECIAL 2009/09/26 01:52:54
    id:chrono1742 氏が回答しているタイムアウト値はいくつでしょう。足りていますか?
    http://q.hatena.ne.jp/1253805203#a952158

  • id:h_kondo
    ファイルシステムがFATだったりしませんか?。
    4G以上のファイルを扱うにはNTFS等、他のファイルシステムを使う必要があります。
  • id:miipa
    >id:chrono1742 氏が回答しているタイムアウト値はいくつでしょう。足りていますか?
    調べ方がわかりません。
  • id:miipa
    >ファイルシステムがFATだったりしませんか?。
    4G以上のファイルを扱うにはNTFS等、他のファイルシステムを使う必要があります。
    調べ方がわかりません。
  • id:HALSPECIAL
    HALSPECIAL 2009/09/26 08:56:32
    php.ini 場所
    httpd.conf 場所
    で検索すれば見つかるはずです。


    >(Mook氏)php.ini のメモリの上限はいくつになっていますか?
    >http://blog.kcg.ne.jp/blog/sato_si/6840


    >(miipa氏)memory_limit = 128M
    >の記述をしております。


    とのやりとりから、php.ini の場所は知っているはずですよ。
  • id:miipa
    >php.ini 場所
    httpd.conf 場所
    で検索すれば見つかるはずです。
    で検索したところ、自分で記述することだったのですね。
    タイムアウト値とはエラーメッセージとかで表示されるものと思っていました。
    そこで、
    max_excution_timeout = 300
    としたのですが、やはり途中で止まってしまいました。
    なにかエラーメッセージが出るようにする方法があればいいのですが・・・。
  • id:miipa
    <?php

    $fcat=fopen("1.csv","r");
    $fcat2=fopen("2.csv","r");

    touch("3.csv");
    $fcat3=fopen("3.csv","w+");

    while($aryDat=fgets($fcat)){
    $aryDat = explode(",", $aryDat);

    $aryDat[1]=trim(fgets($fcat2));
    fwrite($fcat3,$aryDat[0].",");
    fwrite($fcat3,$aryDat[1].",");
    fwrite($fcat3,$aryDat[2].",");
    fwrite($fcat3,$aryDat[3].",");
    fwrite($fcat3,$aryDat[4]);
    }

    fclose($fcat);
    fclose($fcat2);
    fclose($fcat3);
    ?>
    と書いて実行したら完了するようになりました。
    $aryDat=fgetcsv($fcat,10000,",")は一度に読み込むので負荷がかかる。
    $aryDat=fgets($fcat)は一行ずつなので負荷がかからない。
    という認識でいいのでしょうか?
    ちなみに、php.iniのmax_excution_timeout = 300 を記述してもしなくても完了しました。

  • id:Mook
    考えずらいですが1行の長さが10000バイトを超えるものが存在していませんでしたか?

    処理の負荷という点では、fgetcsv($fcat,10000,",") も fgets($fcat) も1行単位なので
    同じオーダーです。

    ファイルシステムは数十MBのファイルを扱う範囲では影響ないでしょう。
    今のところ、原因がわからないです。
  • id:miipa
    >考えずらいですが1行の長さが10000バイトを超えるものが存在していませんでしたか?
    10000バイトって10000文字とかですよね。存在していませんでした。

    >処理の負荷という点では、fgetcsv($fcat,10000,",") も fgets($fcat) も1行単位なので
    同じオーダーです。
    そうですかあ。

    いろいろ考えてくださりありがとうございました。
    根本的な原因が不明のままなのは気持ち悪いですが、動いたから良しとします。
  • id:Mook
    読み込むデータに日本語は含まれているでしょうか。

    fgetcsv から fgets に変更して治ったということは、文字コードに起因した原因だったかもしれません。
    http://yossy.iimp.jp/wp/?p=56

    他のサイトでも同様に、fgetcsv からfgets & explode に変更して解決した例がありました。
    http://kibicho.blog92.fc2.com/blog-entry-26.html

    問題となった1.csv の 13400行(?)のデータを確認してみると何かわかるかもしれません。
    ご参考までに。
  • id:miipa
    回答遅れましてすいません。
    >読み込むデータに日本語は含まれているでしょうか。
    はい。含まれております。

    >fgetcsv から fgets に変更して治ったということは、文字コードに起因した原因だったかもしれません。
    http://yossy.iimp.jp/wp/?p=56
    他のサイトでも同様に、fgetcsv からfgets & explode に変更して解決した例がありました。
    http://kibicho.blog92.fc2.com/blog-entry-26.html
    調べてくださりありがとうございます。
    それが原因だったかもしれません。

    >問題となった1.csv の 13400行(?)のデータを確認してみると何かわかるかもしれません。
    確認しましたがわかりませんでした。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません