2015-04-14 8 views
1

В настоящее время я работаю над проектом, который включает в себя запрос на yahoo-finance для многих различных символов тикера. Узкое место приобретает данные от yahoo, поэтому мне было интересно, есть ли способ ускорить это.Yahoo-Finance Query Speed ​​

Если бы я использовал несколько машин для запроса и затем агрегировал данные, это поможет? У меня только одна физическая машина; как я могу это сделать?

Спасибо!

EDIT: В настоящее время я использую 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.

ВТОРОЙ EDIT: Подробнее Код:

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(); 
    }); 
}); 

}

+1

вы выполнение 1 запроса за линеечку или одного запроса для всех линеечки ? Также покажите код. – ibiza

+0

Ах, только что отредактировано - один запрос за тикер. Если это причина замедления, есть ли способ, которым я могу распылять запросы, чтобы, если операция ухудшилась, я не потеряю все данные? – ZenPylon

ответ

1

Узким потому, что вы делаете один запрос за линеечку.

В зависимости от данных, которые нужно вытащить, если вы можете сделать один запрос, который включает в себя все ваши тикеры, это будет намного быстрее.

Вот пример, если вам нужно, чтобы получить все текущие цены на список линеечки, с помощью одного запроса:

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

+0

Есть ли способ хранить части запроса, чтобы он не был все или ничего? Или мне нужно будет погрузиться в код yahoo-finance, чтобы сделать это? – ZenPylon

+0

Я не уверен, чтобы понять, чего вы хотите/хотите достичь? – ibiza

+0

Например, если интернет-соединение умирает во время запроса, я потеряю все данные. Взглянув на мою текущую реализацию, она не устраняет эту проблему, но мне интересно, есть ли способ сделать это. – ZenPylon