2010-07-09 36 views
5

Tôi đang thử nghiệm với GAE trong 2 tháng qua.Google App Engine nhanh đến mức nào?

Tôi đang lưu bản ghi vào bảng lớn bằng cách tải lên tệp CSV.

Kích thước tệp thử nghiệm của tôi là 300 KB.

Ở đây những gì tôi tìm thấy

hệ thống địa phương

  • Tải lên mất ít hơn 1 giây
  • Process 2500 hồ sơ trong 3 giây

Trên Google Sandbox

  • Quá trình tải lên mất 5-7 giây.

  • Tệp xử lý cho thời gian chờ.

  • Nó chỉ lưu 60-180 bản ghi.

Câu hỏi của tôi là

  1. Tại sao phải mất quá nhiều thời gian?
  2. Có cách nào để giảm thời gian này không?
  3. Google tính việc xử lý này đối với việc sử dụng CPU. Họ không tiết lộ h/w vì vậy những gì CPU nội bộ họ sử dụng? Tôi có nghĩa là tôi nhận được một CPU euquivalent hoặc lớn hơn PIII?

Edited cho @Drew Sears 's câu trả lời.

gì tôi đang làm hiện nay

  1. Tải tệp lên Gae
  2. dữ liệu Nhận tải lên byte. Theo dòng, đếm dòng, lưu nó vào bigtable.
  3. Có một trường duy nhất, id, Bản ghi của tôi.
  4. Bây giờ, tôi tạo hàng đợi

int x = linesCount/50;

for(int i<0;i=x;i++) 
{ 
     x = i * 50; 
     Queue queue = QueueFactory.getQueue("test-queue"); 
     queue.add(TaskOptions.Builder.url("/TestQueue") 
       .param("id", id.toString()) 
       .param("startIdx",String.valueOf(x)) 
       .param("totRec",String.valueOf(50)) 
     ); 
    } 

int y = linesCount % 50; 
if(y > 0) 
{ 
    x = (linesCount/50) * 50; 
    Queue queue = QueueFactory.getQueue("test-queue"); 
    queue.add(TaskOptions.Builder.url("/TestQueue") 
      .param("id", id.toString()) 
      .param("startIdx",String.valueOf(x)) 
      .param("totRec",String.valueOf(y)) 
    );      
} 

Việc xử lý nhiệm vụ servlet đọc tập tin từ lưu trữ và sử dụng totRec và startIdx quá trình tập tin và đóng nó ..

+0

Thời gian bạn trải nghiệm trên hộp cát google theo yêu cầu đầu tiên phải không? Điều gì về yêu cầu hậu quả? – naikus

+0

Độ trễ bạn đang gặp phải không phải do thiếu năng lượng CPU, nhưng bằng cách thực hiện kho dữ liệu GAE (và kết nối mạng của bạn). GAE chia sẻ tài nguyên với các ứng dụng khác trên cùng một máy chủ, nhưng chúng có nhiều chu kỳ CPU để đi xung quanh ... Đó là kho dữ liệu bị trễ. –

+0

Trong yêu cầu đầu tiên, nó chỉ tiết kiệm 60 rceords. Yêu cầu tiếp theo cải thiện tốc độ và tiết kiệm 120-150 hồ sơ. bây giờ tối đa đi đến 184 hồ sơ – Manjoor

Trả lời

4

Điều này thực sự không phải là một cách tuyệt vời để kiểm tra khả năng mở rộng App Engine của.

  1. Nếu bạn mất 7 giây để đăng 300KB, nút cổ chai gần như chắc chắn là băng thông ngược dòng của bạn, không phải băng thông hạ lưu của Google hoặc bất kỳ điều gì liên quan đến App Engine.Tôi thường nhận được tốc độ tải lên nhanh hơn nhiều.
  2. Nếu bạn muốn yêu cầu hoàn tất nhanh hơn, hãy giảm thiểu các cuộc gọi RPC của bạn. Mỗi kho dữ liệu nhận, đặt hoặc truy vấn là một chuyến đi khứ hồi đến một máy chủ bên ngoài. Nếu bạn đang lặp qua hàng trăm hàng và thực hiện đặt bên trong mỗi vòng lặp lặp lại, bạn đang phải gánh chịu một lượng lớn chi phí không cần thiết. Lưu tất cả các thực thể của bạn bằng cách sử dụng một kho dữ liệu và bạn sẽ nhận được kết quả nhanh hơn nhiều. Của Guido AppStats framework là một công cụ tuyệt vời để tìm kiếm các cơ hội tối ưu hóa RPC.
+1

+1 để đề cập đến những nguy hiểm khi thực hiện một lệnh riêng biệt() cho mỗi hàng –

+0

Tôi có thể giảm thiểu yêu cầu RPC nhưng làm cách nào để tôi có thể giảm yêu cầu kho dữ liệu? Tôi phải lưu các bản ghi 3k cần cơ sở dữ liệu 3k đặt (hoặc gọi hàm makePersistant() trong tình huống của tôi). Có phương pháp lưu hàng loạt không? s – Manjoor

+0

Điều tương tự. Mỗi yêu cầu kho dữ liệu là một cuộc gọi RPC. Có, kho dữ liệu cho phép bạn lưu trữ nhiều thực thể trong một cuộc gọi. Trong Python, đây chỉ là db.put() với một danh sách các thực thể; Tôi không biết cú pháp sẽ là gì trong Java. –