2013-10-17 5 views
6

私は自分のアプリケーションに連続して実行スレッドを持っています。このスレッドは、アプリケーション内のすべてのシンボルを格納するHashSetで構成されています。 書かれた時点のデザインに従って、スレッドの真の状態でハッシュセットを連続して繰り返し、HashSet内に含まれるすべてのシンボルのデータベースを更新します。小さなサブセットに分割してバッチ処理する

ハッシュセット内に存在する可能性のある最大シンボルは約6000です。 私は6000すべてのシンボルを一度に使っていませんが、このハッシュセットをそれぞれ500個(12個)の異なるサブセットに分割し、各サブセットを個別に実行し、各サブセット後に15分スリープさせるので、データベースへの圧力。

これは、(サンプルコードスニペット)、私のコードです

どのように私はArrayListの、TreeSetのをpartioningの例を見てきました(、小さいサブセットおよびプロセスに設定を分割することができますが、関連するすべての例を見つけることができませんでした

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

データベースの "圧力" の概念は奇妙なものです... DBがあります通常、この "圧力"を優雅に扱うことができます。 – TwoThe

答えて

9

)HashSetのに

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); 
} 

今、あなたはoriginalSet 12に他のHashSetsを分割しているような何かを。

+0

Amir Pashazadeh、12番は固定されていません、私はちょうどallsymbolSetのdidvide要素を異なるサブハッシュセットにしたいので、各サブセットには500個の要素が含まれています – Pawan

+0

おそらく彼の問題には最適な解決策ではありません。 – TwoThe

+0

@TwoTheあなたの立場からの良い考えはなんでしょうか? – Pawan

0

次のようにあなたの実際の問題は、あなたのコードを変更することであろうために非常に単純な方法:

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

一般的な方法は、単純なループで一つ一つの要素を取り出すイテレータを使用することです: Guava

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

なぜIteratorから要素を削除していますか? – Pawan

+0

あなたはそうする必要はありませんが、そうでない場合は、現在のリストの位置を別の方法で書き留める必要があります。問題は、このコードの次回の呼び出しで_same_アイテムを含むサブリストを再度作成してはならないことです。 – TwoThe

24

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

私たちは、次のAPPRを使用することができますセットを分割する。

我々は として出力を取得します[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); 
    } 
} 
関連する問題