2013-03-17 41 views
6
// parallel processing 

    int processors = Runtime.getRuntime().availableProcessors(); 
    ExecutorService executorService = Executors.newFixedThreadPool(threads); 


    final List<String> albumIds2 = new ArrayList<String>(); 
    long start2 = System.nanoTime(); 
    for (final HColumn<String, String> column : result.get().getColumns()) { 
     Runnable worker = new Runnable() { 

      @Override 
      public void run() { 
       albumIds2.add(column.getName()); 
      } 
     }; 
     executorService.execute(worker); 
    } 
    long timeTaken2 = System.nanoTime() - start2; 

tôi có mã như ví dụ trên tạo ra List<String> của id album. cột là một lát từ cơ sở dữ liệu cassandra. tôi ghi lại thời gian thực hiện cho toàn bộ danh sách các album sẽ được tạo.Khi nào xử lý song song khắc phục xử lý tuần tự?

cùng tôi đã thực hiện bằng cách sử dụng vòng lặp nâng cao như dưới đây.

 QueryResult<ColumnSlice<String, String>> result = CassandraDAO.getRowColumns(AlbumIds_CF, customerId); 
    long start = System.nanoTime(); 
    for (HColumn<String, String> column : result.get().getColumns()) { 
     albumIds.add(column.getName()); 
    } 
    long timeTaken = System.nanoTime() - start; 

tôi lưu ý rằng bất kể số lượng album bao nhiêu, mỗi vòng lặp luôn mất một thời gian ngắn hơn để hoàn thành. Tôi có làm sai không? hoặc tôi cần một máy tính với nhiều lõi. Tôi thực sự mới với toàn bộ khái niệm về tính toán song song, xin hãy tha thứ cho tôi nếu câu hỏi của tôi là ngu ngốc.

+0

"* tôi có cần một máy tính có nhiều lõi không? *" => Có. Như đã nói bên dưới, hãy thử nhóm các cột của bạn theo lô có ít nhất 100 hoặc nhiều hơn để có hiệu suất tốt hơn. – assylias

Trả lời

6

Trong ví dụ song song của bạn, bạn đang gửi một nhiệm vụ cho mỗi cột. Các chi phí của enqueing nhiệm vụ có lẽ lớn hơn lợi ích của việc thực hiện paralell. Điều này càng trầm trọng hơn bởi "nhiệm vụ" thực sự là một nhiệm vụ nhanh (chèn một phần tử vào một mảng và trả về). Thật vậy, các Executor thêm mỗi nhiệm vụ nhận được vào một hàng đợi (và rằng bổ sung là tốn kém). Sau đó, bạn đang thêm nhiệm vụ N vào hàng đợi và mỗi tác vụ sẽ thêm phần tử vào mảng. Thao tác đồng thời chỉ thực hiện phần sau

Nếu tác vụ phức tạp hơn, bạn có thể gửi tác phẩm theo "khối" (ví dụ, nếu bạn có N phần tử và bộ xử lý P, mỗi đoạn sẽ có phần tử N/P hoặc N/P + 1 phần tử). Chiến lược đó giúp giảm chi phí.

Lưu ý rằng ArrayList không được đồng bộ hóa, khi đó việc thực hiện đồng thời một số tác vụ có thể làm hỏng danh sách của bạn. Bạn có thể sử dụng một bộ sưu tập đồng thời để tránh vấn đề này, nhưng quan sát đầu tiên vẫn còn.

+0

Điểm ghi nhận câu trả lời rất rõ ràng và chính xác. – qualebs

+2

Bạn cũng có thể đề cập đến [luật của Amdahl] (http://en.wikipedia.org/wiki/Amdahl%27s_law) trong ngữ cảnh chung hơn. –

-1

Đó là một thực tế không tốt, thời gian và cpu được tiêu thụ để tạo chủ đề nhiều hơn những gì mà chuỗi của bạn đang làm: albumIds2.add (column.getName());

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