1

私は現在、yahoo-finance にさまざまなティッカー シンボルを照会するプロジェクトに取り組んでいます。ボトルネックはyahooからデータを取得することなので、これを高速化する方法があるかどうか疑問に思っていました.

複数のマシンを使用してクエリを実行し、データを集計した場合、それは役に立ちますか? 物理マシンは 1 台しかありません。どうすればそれを行うことができますか?

ありがとう!

編集: 現在、Node.js、yahoo-finance、および Q.deferred を使用して、yahoo に履歴データを要求しています。次に、すべての約束が (ティッカーごとに) 満たされると、Q.all() を実行してデータを永続化します。

    var data = [];
    tickers = ["goog", "aapl", ...];
    ...
    Q.all(_.map(tickers, function(symbol) { 
        return getYahooPromise(symbol);
     }))
    .done( function() { persistData(data) });

getYahooPromise はティッカー シンボルのデータを取得し、データ配列にプッシュします。すべての約束が解決されると、データは MySQL データベースに保存されます。

2番目の編集:その他のコード:

var sequentialCalls = [];

for ( var i = 0; i < tickers.length / chunkSize; i++ ) {
    sequentialCalls.push( persistYahooChunk );
}
sequentialCalls.push( function(callback) { 
    connection.end(); 
    callback();
});

async.series( sequentialCalls )



exports.persistYahooChunk = function(callback) {
console.log("Starting yahoo query");
var currentTickers = tickers.slice(currentTickerIndex,currentTickerIndex + chunkSize);


return yahooFinance.historical( {
    symbols: currentTickers,
    from: "2015-01-28",
    to: "2015-02-05"
}).then( function(result) {
    console.log("Query " + currentTickerIndex +  "/" + tickers.length + "completed");
    currentTickerIndex += chunkSize;
    //add valid data
    var toPersist = _.map(result, function(quotes, symbol) {
            return [symbol, quotes.length != 0 ];
    });


    var query = "INSERT INTO `ticker` (`symbol`, `valid`) VALUES ?";
    connection.query(query, [toPersist], function(err, result) {
        if (err) {
            console.log (err);
        }
        //console.log(result);

        callback();
    });
});

}

4

1 に答える 1

1

ボトルネックは、ティッカーごとに 1 つのクエリを実行しているためです。

プルする必要があるデータにもよりますが、すべてのティッカーを含む単一のクエリを実行できれば、はるかに高速になります。

単一のクエリで、ティッカーのリストの現在の価格をすべて取得する必要がある場合の例を次に示します。

http://finance.yahoo.com/webservice/v1/symbols/A,B,C,D,E/quote?format=json

于 2015-04-14T16:50:45.027 に答える