qwerty787788

Logs Collector

Jan 6th, 2019
587
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.85 KB | None | 0 0
  1. import java.util.Random;
  2.  
  3. public class LogsCollectorExample {
  4.  
  5.     public static void main(String[] args) {
  6.         final int HASHSETS_NUM = 20;
  7.  
  8.         final OpenAddressHashSet[] hashsets = new OpenAddressHashSet[HASHSETS_NUM];
  9.         for (int i = 0; i < hashsets.length; i++) {
  10.             hashsets[i] = new OpenAddressHashSet();
  11.         }
  12.         addRandomElementsToHashtables(hashsets);
  13.         System.out.println("Added all elements to sets. Start sending them to one set");
  14.  
  15.  
  16.         // Now we want to send all elements from all sets to the one big set.
  17.         // We create iterator for each hashset.
  18.         // In a cycle we send one element from each set to the big one until all elements are sent.
  19.         final HashSetIterator[] iters = new HashSetIterator[hashsets.length];
  20.         for (int i = 0; i < iters.length; i++) {
  21.             iters[i] = new HashSetIterator(hashsets[i]);
  22.         }
  23.  
  24.         final OpenAddressHashSet sumHashSet = new OpenAddressHashSet();
  25.         long hasSent = 0;
  26.         final long START_TIME = System.currentTimeMillis();
  27.         long lastTime = START_TIME;
  28.         while (true) {
  29.             boolean changed = false;
  30.             for (HashSetIterator iter : iters) {
  31.                 if (iter.hasNext()) {
  32.                     changed = true;
  33.                     sumHashSet.add(iter.next());
  34.                     if (++hasSent % 30000 == 0) {
  35.                         long currentTime = System.currentTimeMillis();
  36.                         System.out.printf("queries sent: %dK, elements: %d, total_time: %d ms, diff_time: %d ms\n", hasSent / 1000, sumHashSet.usedCnt, currentTime - START_TIME, currentTime - lastTime);
  37.                         lastTime = currentTime;
  38.                     }
  39.                 }
  40.             }
  41.             if (!changed) {
  42.                 break;
  43.             }
  44.         }
  45.         System.out.println("Done!");
  46.     }
  47.  
  48.     private static void addRandomElementsToHashtables(OpenAddressHashSet[] hashsets) {
  49.         final Random rnd = new Random(123);
  50.         final int CNT_DIFFERENT_ELEMENTS = 2_000_000;
  51.         for (int i = 0; i < CNT_DIFFERENT_ELEMENTS; i++) {
  52.             long value = rnd.nextLong();
  53.             int cntHashSets = rnd.nextInt(10);
  54.             for (int j = 0; j < cntHashSets; j++) {
  55.                 int hashsetId = rnd.nextInt(hashsets.length);
  56.                 hashsets[hashsetId].add(value);
  57.             }
  58.         }
  59.     }
  60.  
  61.     static class OpenAddressHashSet {
  62.         private long[] values;
  63.         private boolean[] used;
  64.         int usedCnt;
  65.  
  66.         OpenAddressHashSet() {
  67.             init(10);
  68.         }
  69.  
  70.         public void add(long x) {
  71.             needResize();
  72.             int pos = getHashCode(x);
  73.             while (used[pos]) {
  74.                 if (values[pos] == x) {
  75.                     return;
  76.                 }
  77.                 pos = next(pos);
  78.             }
  79.             used[pos] = true;
  80.             values[pos] = x;
  81.             usedCnt++;
  82.         }
  83.  
  84.         private void needResize() {
  85.             if (usedCnt * 2 > values.length) {
  86.                 boolean[] oldUsed = used;
  87.                 long[] oldValues = values;
  88.                 init((int) Math.max(10, values.length * 5L / 3));
  89.                 for (int i = 0; i < oldUsed.length; i++) {
  90.                     if (oldUsed[i]) {
  91.                         add(oldValues[i]);
  92.                     }
  93.                 }
  94.             }
  95.         }
  96.  
  97.         private int next(int x) {
  98.             return x == values.length - 1 ? 0 : (x + 1);
  99.         }
  100.  
  101.         private int getHashCode(long x) {
  102.             final long MAGIC = 3452352354234535423L; // just some random odd number
  103.             int pos = (int) (x * MAGIC % values.length);
  104.             if (pos < 0) {
  105.                 pos += values.length;
  106.             }
  107.             return pos;
  108.         }
  109.  
  110.         private void init(int size) {
  111.             values = new long[size];
  112.             used = new boolean[size];
  113.             usedCnt = 0;
  114.         }
  115.     }
  116.  
  117.     static class HashSetIterator {
  118.         private int iter;
  119.         private OpenAddressHashSet hashSet;
  120.  
  121.         HashSetIterator(OpenAddressHashSet hashSet) {
  122.             this.hashSet = hashSet;
  123.             iter = -1;
  124.             goToNextElement();
  125.         }
  126.  
  127.         public boolean hasNext() {
  128.             return iter != hashSet.values.length;
  129.         }
  130.  
  131.         public long next() {
  132.             if (iter == hashSet.values.length) {
  133.                 throw new AssertionError("no more elements");
  134.             }
  135.             long result = hashSet.values[iter];
  136.             goToNextElement();
  137.             return result;
  138.         }
  139.  
  140.         private void goToNextElement() {
  141.             iter++;
  142.             while (iter != hashSet.values.length) {
  143.                 if (hashSet.used[iter]) {
  144.                     break;
  145.                 }
  146.                 iter++;
  147.             }
  148.         }
  149.     }
  150. }
Advertisement
Add Comment
Please, Sign In to add comment