0

現在、ヤフーのcsvファイルを読み込んで在庫データを保存しようとしています。NASDAQ/NYSE/AMEX のティッカー名をテーブル (約 6,5 K テーブル) として構成する stocks というデータベースを作成しました。問題は、取得したデータの保存に時間がかかりすぎることです。セーブデータを1分刻みでロードしたい。読み込みには約 30 秒かかり、保存には約 3 分かかります。保存時間を短縮する必要があります。データを取得して保存するために私が書いたスクリプトは次のとおりです。

 include('mysql_connect.php');

 $ticker=array();
 $db="stocks";
 $res=mysql_query("SHOW TABLES FROM $db");
 while($row=mysql_fetch_array($res,MYSQL_NUM)){
    $ticker[]=$row[0];
 }

 $ticker_length=count($ticker);
 $steps=floor($ticker_length/200);

for($j=0;$j<=$steps;$j++){
    $ticker_url="";
    if($j<$steps){
        for($i=$j*200;$i<($j+1)*200;$i++){
            if($i==(($j+1)*200)-1){
                $ticker_url=$ticker_url.$ticker[$i];
            }else{
                $ticker_url=$ticker_url.$ticker[$i]."+";
            }
        }

    $url="http://finance.yahoo.com/d/quotes.csv?s='$ticker_url'&f=snxab2l1va2p2opm3m4ghd1t1=.csv";
    $filehandle=fopen("$url","r");
    while(!feof($filehandle)){

        $line=fgetcsv($filehandle,1024);
        if( $line[0]=="" || $line[0]==null || !isset($line[0]) ){
            //echo"Leer<br/>";
        }else{
            $Symbol=strtolower($line[0]);
            $Name=$line[1];
            $LastTradePriceOnly=$line[5];
            $Volume=$line[6];


                    $query=mysql_query("INSERT INTO $Symbol(symbol,Name,LastTradePriceOnly,Volume) 
                    VALUES('$Symbol','$Name','$LastTradePriceOnly','$Volume')");
        }

     }
     fclose($filehandle);   

    }else{
        for($i=$j*200;$i<$ticker_length;$i++){
            if($i==$ticker_length-1){
                $ticker_url=$ticker_url.$ticker[$i];
            }else{
                $ticker_url=$ticker_url.$ticker[$i]."+";
            }
        }

    $url="http://finance.yahoo.com/d/quotes.csv?s='$ticker_url'&f=snxab2l1va2p2opm3m4ghd1t1=.csv";
    $filehandle=fopen("$url","r");
    while(!feof($filehandle)){

        $line=fgetcsv($filehandle,1024);
        if( $line[0]=="" || $line[0]==null || !isset($line[0]) ){
            //echo"empty<br/>";
        }else{
            $Symbol=strtolower($line[0]);
            $Name=$line[1];
            $LastTradePriceOnly=$line[5];
            $Volume=$line[6];

                    $query=mysql_query("INSERT INTO $Symbol(symbol,Name,LastTradePriceOnly,Volume) 
                    VALUES('$Symbol','$Name','$LastTradePriceOnly','$Volume')");
        }

     }
     fclose($filehandle);
    }
}

だから今私は知りたい:

  1. スクリプトを変更して、より速く保存する方法はありますか?
  2. buffer_size などの mysql 設定を構成する可能性があることは知っています。どうすればそれを行うことができ、何を変更する必要がありますか?
  3. これが必要な節約時間である場合、mysql では不可能な場合、どのような代替手段がありますか?

助けが得られれば幸いです。

ありがとう。

4

1 に答える 1

0

私は解決策を見つけました。Mysql では、複雑なループで行を読み取ることなく、csv から行と列を保存できます。

    $url = "http://finance.yahoo.com/d/quotes.csv?s=AAPL+MSFT+GOOG&f=...the datas you need=.csv";

    $sql = "LOAD DATA LOCAL INFILE '" . $url . "' 
    INTO TABLE `" . $data_tablename . "` 
    FIELDS 
    TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '\"' 
    LINES 
    TERMINATED BY '\n' 
    (`your_cols`,``,.....)";

     mysql_query($sql)or die(mysql_error());

私のスクリプトはサーバー上で 250 秒かかりましたが、今ではわずか 45 秒です。時間の驚くべき利益....

于 2013-01-06T01:00:26.520 に答える