2011-12-06 41 views
5

Tôi đang sử dụng API bảng tính Google để cập nhật bảng tính với nhiều dữ liệu (hàng trăm hàng và khoảng hai mươi cột).Cách nhanh nhất để cập nhật bảng tính google với nhiều dữ liệu thông qua api bảng tính là gì?

Tôi đã thử nghiệm thực hiện cuộc gọi hàng loạt để cập nhật 2500 ô. Cuộc gọi mất khoảng 40 giây để hoàn thành, với yêu cầu là khoảng 1mb và phản hồi là ~ 2mb.

Có cách nào để làm cho nó hoạt động nhanh hơn không?

+0

bạn có đang sử dụng nguồn cấp dữ liệu di động hoặc liệt kê nguồn cấp dữ liệu không? – Simon

+0

Tôi đang sử dụng nguồn cấp dữ liệu di động – Daniel

Trả lời

1

Nếu bạn đang cập nhật toàn bộ dòng, bạn có thể thử làm việc với thức ăn danh sách dựa trên:

http://code.google.com/intl/fr-FR/apis/spreadsheets/data/3.0/developers_guide.html#UpdatingListRows

Nó sẽ cho phép bạn cập nhật các giá trị (không phải công thức).

Nếu bạn vẫn còn có vấn đề hiệu suất, bạn nên chuyển sang một cái gì đó giống như một máy chủ cơ sở dữ liệu quan hệ hoặc kho dữ liệu của google (nếu bạn đang làm việc với công cụ ứng dụng google)

+1

Cảm ơn. Nhưng tôi hiểu không có cách nào để thực hiện cập nhật hàng loạt các hàng sao cho có nghĩa là hàng trăm yêu cầu.http: //www.google.com/support/forum/p/apps-apis/thread? Tid = 5db19d43cb454e7e & hl = vi Sử dụng kho dữ liệu khác không phải là một tùy chọn cho tôi khi ứng dụng của tôi được tạo để thao tác bảng tính google và không lưu trữ dữ liệu này. – Daniel

11

tôi đã có thể đẩy nhanh tiến độ theo yêu cầu hàng loạt cung cấp trong API chính thức http://code.google.com/apis/spreadsheets/data/3.0/developers_guide.html#SendingBatchRequests bằng cách bỏ qua phần QUERY trước UPDATE. Vì vậy, đây là những gì họ có trong ví dụ:

// Prepare the update 
    // getCellEntryMap is what makes the update fast. 
    Map cellEntries = getCellEntryMap(ssSvc, cellFeedUrl, cellAddrs); 

    CellFeed batchRequest = new CellFeed(); 
    for (CellAddress cellAddr : cellAddrs) { 
     URL entryUrl = new URL(cellFeedUrl.toString() + "/" + cellAddr.idString); 
     CellEntry batchEntry = new CellEntry(cellEntries.get(cellAddr.idString)); 
     batchEntry.changeInputValueLocal(cellAddr.idString); 
     BatchUtils.setBatchId(batchEntry, cellAddr.idString); 
     BatchUtils.setBatchOperationType(batchEntry, BatchOperationType.UPDATE); 
     batchRequest.getEntries().add(batchEntry); 
    } 
    // Submit the update 
    Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM); 
    CellFeed batchResponse = ssSvc.batch(new URL(batchLink.getHref()), batchRequest); 

và đây là những gì tôi đã thay đổi nó để

CellFeed batchRequest = new CellFeed(); 
     for (CellInfo cellAddr : cellsInfo) { 
      CellEntry batchEntry = new CellEntry(cellAddr.row, cellAddr.col, cellAddr.idString); 
       batchEntry.setId(String.format("%s/%s", worksheet.getCellFeedUrl().toString(), cellAddr.idString));   
       BatchUtils.setBatchId(batchEntry, cellAddr.idString); 
       BatchUtils.setBatchOperationType(batchEntry, BatchOperationType.UPDATE); 
       batchRequest.getEntries().add(batchEntry); 



     } 

     CellFeed cellFeed = ssSvc.getFeed(worksheet.getCellFeedUrl(), CellFeed.class);  
     Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM); 

     ssSvc.setHeader("If-Match", "*"); 
     CellFeed batchResponse = ssSvc.batch(new URL(batchLink.getHref()), batchRequest); 
     ssSvc.setHeader("If-Match", null); 

Thông báo, tiêu đề phải được thay đổi để làm cho nó làm việc.

+0

Câu trả lời hay. Cảm ơn. Nó giảm thời gian chèn xuống còn 4,5 giây. –

+1

Tiêu đề If-Match là chìa khóa! Cảm ơn. –

2

Tăng tốc: được đăng bởi David Tolioupov - nó hoạt động. Một số thông tin bổ sung đã giúp.

Ví dụ về cách sử dụng CellFeed, xem CellDemo.java http://gdata-java-client.googlecode.com/svn-history/r51/trunk/java/sample/spreadsheet/cell/CellDemo.java

Ví dụ có chi tiết, đủ chi tiết rằng nó đã giúp tôi tối ưu hóa mã của tôi.

Như đã trình bày bởi David Tolioupov, tạo CellEntry theo cách này:

CellEntry batchEntry = new CellEntry(cellAddr.row, cellAddr.col, cellAddr.idString); 
batchEntry.setId(String.format("%s/%s", cellFeedUrl.toString(), cellAddr.idString)); 

Từ ví dụ:

/** 
* Returns a CellEntry with batch id and operation type that will tell the 
* server to update the specified cell with the given value. The entry is 
* fetched from the server in order to get the current edit link (for 
* optimistic concurrency). 
* 
* @param row the row number of the cell to operate on 
* @param col the column number of the cell to operate on 
* @param value the value to set in case of an update the cell to operate on 
* 
* @throws ServiceException when the request causes an error in the Google 
*   Spreadsheets service. 
* @throws IOException when an error occurs in communication with the Google 
*   Spreadsheets service. 
*/ 
private CellEntry createUpdateOperation(int row, int col, String value) 
    throws ServiceException, IOException { 
    String batchId = "R" + row + "C" + col; 
    URL entryUrl = new URL(cellFeedUrl.toString() + "/" + batchId); 
    CellEntry entry = service.getEntry(entryUrl, CellEntry.class); 
    entry.changeInputValueLocal(value); 
    BatchUtils.setBatchId(entry, batchId); 
    BatchUtils.setBatchOperationType(entry, BatchOperationType.UPDATE); 

    return entry; 
} 

Tất cả những gì được yêu cầu là cellFeedUrl, sau đó tạo ra các yêu cầu và gửi đi.

Các vấn đề liên quan