2013-08-16 5 views
0

Я написал функцию для чтения некоторых данных из внешнего API. Что моя функция делает, она вызывает этот API при чтении файла с диска. Я хочу оптимизировать свой код для большого размера файла (35000 записей). Не могли бы вы предложить мне об этом.Чтение данных из API

Ниже приведен мой код.

public void readCSVFile() { 

    try { 

     br = new BufferedReader(new FileReader(getFileName())); 

     while ((line = br.readLine()) != null) { 


      String[] splitLine = line.split(cvsSplitBy); 

      String campaign = splitLine[0]; 
      String adGroup = splitLine[1]; 
      String url = splitLine[2];    
      long searchCount = getSearchCount(url);    

      StringBuilder sb = new StringBuilder(); 
      sb.append(campaign + ","); 
      sb.append(adGroup + ",");    
      sb.append(searchCount + ",");    
      writeToFile(sb, getNewFileName()); 

     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private long getSearchCount(String url) { 
    long recordCount = 0; 
    try { 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 

     HttpGet getRequest = new HttpGet(
       "api.com/querysearch?q=" 
         + url); 
     getRequest.addHeader("accept", "application/json"); 

     HttpResponse response = httpClient.execute(getRequest); 

     if (response.getStatusLine().getStatusCode() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + response.getStatusLine().getStatusCode()); 
     } 

     BufferedReader br = new BufferedReader(new InputStreamReader(
       (response.getEntity().getContent()))); 

     String output; 

     while ((output = br.readLine()) != null) { 
      try { 

       JSONObject json = (JSONObject) new JSONParser() 
         .parse(output); 
       JSONObject result = (JSONObject) json.get("result"); 
       recordCount = (long) result.get("count"); 
       System.out.println(url + "=" + recordCount); 

      } catch (Exception e) { 
       System.out.println(e.getMessage()); 
      } 

     } 

     httpClient.getConnectionManager().shutdown(); 

    } catch (Exception e) { 
     e.getStackTrace(); 
    } 
    return recordCount; 

} 
+0

Ваше узкое место, безусловно, будет вашим HTTP-материалом. Я бы это оптимизировал. Возможно, не отключите соединения или получите массовые результаты, если это возможно. –

+0

Да проблема есть. Проблема в том, что я должен назвать этот API параметром GET, который поступает из файла. – Duleendra

ответ

1

Поскольку удаленные вызовы медленнее, чем локальный доступ к диску, вам необходимо каким-то образом распараллелить или пакетные удаленные вызовы. Если вы не можете сделать пакетные вызовы на удаленный API, но позволяет несколько одновременных читает, то, возможно, вы хотите использовать что-то вроде пула потоков, чтобы сделать удаленные вызовы:

public void readCSVFile() { 
    // exception handling ignored for space 
    br = new BufferedReader(new FileReader(getFileName())); 
    List<Future<String>> futures = new ArrayList<Future<String>>(); 
    ExecutorService pool = Executors.newFixedThreadPool(5); 

    while ((line = br.readLine()) != null) { 
     final String[] splitLine = line.split(cvsSplitBy); 
     futures.add(pool.submit(new Callable<String> { 
      public String call() { 
       long searchCount = getSearchCount(splitLine[2]); 
       return new StringBuilder() 
        .append(splitLine[0]+ ",") 
        .append(splitLine[1]+ ",") 
        .append(searchCount + ",") 
        .toString(); 
      } 
     })); 
    } 

    for (Future<String> fs: futures) { 
     writeToFile(fs.get(), getNewFileName()); 
    } 

    pool.shutdown(); 
} 

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

+0

Спасибо за предложение. BTW Я не могу сделать отдельное чтение. но допускается несколько одновременных чтений. – Duleendra

+0

Привет DPM Я устал от вашего решения, и это сработало. :) – Duleendra

Смежные вопросы