Şimdi Ara

Java - 3 adet long[] array'da 100M+ veri merge işlemi

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
2
Cevap
0
Favori
79
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Herkese Merhabalar,

    Testte rastladığım bir soru var. Tam olarak şöyle :

    quote:


    -Implement an efficient methot to merge 3 sets of very large (Length: 100M+) long[] arrays.

    -Input data randomly generated, not sorted, may contain duplicateds.

    -Duplicate items should be removed in output.



    3 Adet long[] değişkeni var ve hepsine ilk önce en az 100M adet random veri giriyoruz. Daha sonra bunları merge edip, duplicate olanları kaldırıp yeni long[] değişkenine atıyoruz. Oldukça kolay fakat 100M veri olduğu için bir o kadar da zor. En optimize, en verimli, karmaşıklığı en az bir yol ile çözmem gerekiyor.

    Aklımda optimize etmek için direkt BitSet geldi fakat daha önce hiç kullanmamıştım. Test zamanım da BitSet öğrenmek için yeterli değildi. https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

    HashSet ile denediğimde yine aynı şekilde heap hatası alıyordum.

    Yazdığım kod aşağıdaki gibi :


    package exam1;

    import java.time.Duration;
    import java.time.Instant;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Random;

    /**
    *
    * @author Furkan
    */

    //VM OPTIONS -> -Xincgc -Xmx4g -Xms4g

    public final class Exam1 {

    private static final int LENGTH = 100000000;

    private volatile long[] m_testArr1 = null;
    private volatile long[] m_testArr2 = null;
    private volatile long[] m_testArr3 = null;

    private volatile long[] m_merged = null;

    private Random m_r = new Random(System.currentTimeMillis());


    public static void main(String[] args) {
    Exam1 exam = new Exam1();

    Instant start1 = Instant.now();
    System.out.println("Fill Started");
    exam.Fill();

    Instant end1 = Instant.now();
    System.out.println("Fill Ended : " + Duration.between(start1, end1));

    Instant start2 = Instant.now();
    System.out.println("Merge Started");
    exam.Merge();
    Instant end2 = Instant.now();
    System.out.println("Merge Ended : " + Duration.between(start1, end1));

    Instant start3 = Instant.now();
    System.out.println("DupRemove Started");
    exam.DupRemove();
    Instant end3 = Instant.now();
    System.out.println("DupRemove Ended : " + Duration.between(start1, end1));
    }

    private void Fill(){
    this.m_testArr1 = new long[Exam1.LENGTH];
    this.m_testArr2 = new long[Exam1.LENGTH];
    this.m_testArr3 = new long[Exam1.LENGTH];

    for (int i = 0; i < Exam1.LENGTH; i++) {
    this.m_testArr1[i] = this.m_r.nextLong();
    this.m_testArr2[i] = this.m_r.nextLong();
    this.m_testArr3[i] = this.m_r.nextLong();
    }
    }

    private void Merge(){
    this.m_merged = this.TryMerge(this.m_testArr1, this.m_testArr2, this.m_testArr3);
    }

    private void DupRemove(){
    this.m_merged = this.RemoveDuplicates(this.m_merged);
    }

    public long[] TryMerge(long[] arr1, long[] arr2, long[] arr3){
    int aLen = arr1.length;
    int bLen = arr2.length;
    int cLen = arr3.length;

    int len = aLen + bLen + cLen;

    //TODO: Use BitSize for RAM optimize. IDK how to use...

    //OutOfMemory Exception on this line.
    long[] mergedArr = new long[len];
    this.m_merged = new long[len];

    //long[] mergedArr = (long[]) Array.newInstance(long.class, aLen+bLen+cLen);

    System.arraycopy(arr1, 0, mergedArr, 0, aLen);
    System.arraycopy(arr2, 0, mergedArr, aLen, bLen);
    System.arraycopy(arr3, 0, mergedArr, (aLen + bLen), cLen);


    return mergedArr;
    }

    //!!!NOT WORKING!!!
    private long[] RemoveDuplicates(long[] arr){
    HashSet<Long> set = new HashSet<Long>();

    final int len = arr.length;
    for(int i = 0; i < len; i++){
    set.add(arr[i]);
    }

    long[] clean = new long[set.size()];
    int i = 0;
    for (Iterator<Long> it = set.iterator(); it.hasNext();) {
    clean[i++] = it.next();
    }
    return clean;
    }
    }



    Run Args: -Xincgc -Xmx4g -Xms4g

    Exception : Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at test.

    Şimdiden Teşekkürler...







  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.