2013-10-17 14 views
6

Tôi có một chuỗi chạy liên tục trong Ứng dụng của tôi, bao gồm một HashSet để lưu trữ tất cả các ký hiệu bên trong Ứng dụng. Theo thiết kế tại thời điểm nó được viết, bên trong Thread trong khi điều kiện thực, nó sẽ lặp lại hashset liên tục và cập nhật Database cho tất cả các ký hiệu chứa bên trong HashSet.Phân vùng a Đặt thành các Tập hợp con nhỏ hơn và xử lý theo lô

Biểu tượng tối đa có thể có mặt bên trong bộ băm sẽ khoảng 6000. Tôi không db với tất cả 6000 ký tự cùng một lúc, nhưng chia hashset này thành các tập con khác nhau là 500 (12 bộ) và thực thi từng tập con riêng lẻ và có một chuỗi ngủ sau mỗi tập con trong 15 phút, vì vậy tôi có thể giảm áp lực lên cơ sở dữ liệu.

Đây là mã của tôi, (đoạn mã mẫu)

Làm thế nào tôi có thể phân vùng một Set thành các tập con nhỏ hơn và quá trình, (tôi đã thấy những ví dụ cho partioning ArrayList, TreeSet, nhưng không tìm thấy bất kỳ ví dụ liên quan để HashSet)

package com.ubsc.rewji.threads; 

import java.util.Arrays; 
import java.util.Collections; 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Set; 
import java.util.concurrent.PriorityBlockingQueue; 

public class TaskerThread extends Thread { 
    private PriorityBlockingQueue<String> priorityBlocking = new PriorityBlockingQueue<String>(); 
    String symbols[] = new String[] { "One", "Two", "Three", "Four" }; 
    Set<String> allSymbolsSet = Collections 
      .synchronizedSet(new HashSet<String>(Arrays.asList(symbols))); 

    public void addsymbols(String commaDelimSymbolsList) { 
     if (commaDelimSymbolsList != null) { 
      String[] symAr = commaDelimSymbolsList.split(","); 
      for (int i = 0; i < symAr.length; i++) { 
       priorityBlocking.add(symAr[i]); 
      } 
     } 
    } 

    public void run() { 
     while (true) { 
      try { 
       while (priorityBlocking.peek() != null) { 
        String symbol = priorityBlocking.poll(); 
        allSymbolsSet.add(symbol); 
       } 
       Iterator<String> ite = allSymbolsSet.iterator(); 
       System.out.println("======================="); 
       while (ite.hasNext()) { 
        String symbol = ite.next(); 
        if (symbol != null && symbol.trim().length() > 0) { 
         try { 
          updateDB(symbol); 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
       Thread.sleep(2000); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void updateDB(String symbol) { 
     System.out.println("THE SYMBOL BEING UPDATED IS" + " " + symbol); 
    } 

    public static void main(String args[]) { 
     TaskerThread taskThread = new TaskerThread(); 
     taskThread.start(); 

     String commaDelimSymbolsList = "ONVO,HJI,HYU,SD,F,SDF,ASA,TRET,TRE,JHG,RWE,XCX,WQE,KLJK,XCZ"; 
     taskThread.addsymbols(commaDelimSymbolsList); 

    } 

} 
+0

Khái niệm về "áp lực" trên cơ sở dữ liệu là một trong những kỳ lạ ... DBS là thường rất tốt để có thể xử lý "áp lực" một cách duyên dáng. – TwoThe

Trả lời

9

làm cái gì đó như

private static final int PARTITIONS_COUNT = 12; 

List<Set<Type>> theSets = new ArrayList<Set<Type>>(PARTITIONS_COUNT); 
for (int i = 0; i < PARTITIONS_COUNT; i++) { 
    theSets.add(new HashSet<Type>()); 
} 

int index = 0; 
for (Type object : originalSet) { 
    theSets.get(index++ % PARTITIONS_COUNT).add(Object); 
} 

Bây giờ bạn đã phân chia các originalSet thành 12 HashSets khác.

+0

cảm ơn Amir Pashazadeh, số 12 không cố định, tôi chỉ muốn các phần tử didvide trong allsymbolSet thành hashset phụ khác nhau, sao cho mỗi tập con chứa 500 phần tử – Pawan

+0

Có lẽ không phải là giải pháp tốt nhất cho vấn đề của mình, nhưng ý tưởng tốt. – TwoThe

+0

@TwoThe Tôi có thể biết ý tưởng hay là từ quan điểm của bạn không ?? – Pawan

0

Một cách rất đơn giản cho vấn đề thực tế của bạn sẽ thay đổi mã của bạn như sau:

Iterator<String> ite = allSymbolsSet.iterator(); 
System.out.println("======================="); 
int i = 500; 
while ((--i > 0) && ite.hasNext()) { 

Một phương pháp chung sẽ được sử dụng lặp đi các yếu tố ra từng người một trong một vòng lặp đơn giản:

int i = 500; 
while ((--i > 0) && ite.hasNext()) { 
    sublist.add(ite.next()); 
    ite.remove(); 
} 
+0

tại sao bạn loại bỏ các yếu tố từ Iterator ?? – Pawan

+0

Bạn không cần phải làm vậy, nhưng nếu bạn không phải ghi nhớ vị trí danh sách hiện tại của mình theo cách khác. Vấn đề là, lệnh gọi tiếp theo của mã này không được tạo lại danh sách con với các mục _same_ nữa. – TwoThe

24

với Guava:

for (List<String> partition : Iterables.partition(yourSet, 500)) { 
    // ... handle partition ... 
} 
1

Chúng tôi có thể sử dụng appr sau oach để chia một Set.

Chúng tôi sẽ nhận được đầu ra như [a, b] [c, d] [e] `

private static List<Set<String>> partitionSet(Set<String> set, int  partitionSize) 
{ 
    List<Set<String>> list = new ArrayList<>(); 
    int setSize = set.size(); 

    Iterator iterator = set.iterator(); 

    while(iterator.hasNext()) 
    { 
     Set newSet = new HashSet(); 
     for(int j = 0; j < partitionSize && iterator.hasNext(); j++) 
     { 
      String s = (String)iterator.next(); 
      newSet.add(s); 
     } 
     list.add(newSet); 
    } 
    return list; 
} 

public static void main(String[] args) 
{ 
    Set<String> set = new HashSet<>(); 
    set.add("a"); 
    set.add("b"); 
    set.add("c"); 
    set.add("d"); 
    set.add("e"); 

    int size = 2; 
    List<Set<String>> list = partitionSet(set, 2); 

    for(int i = 0; i < list.size(); i++) 
    { 
     Set<String> s = list.get(i); 
     System.out.println(s); 
    } 
} 
Các vấn đề liên quan