Misalkan saya ingin membaca file besar di mana setiap baris mewakili objek domain, dan saya perlu menyimpan informasi ini dalam cache. File ini dibaca menggunakan beberapa utas. Setiap utas membaca rentang garis tertentu dan mereka akan menempatkan objek yang dipetakan dalam Daftar. Di akhir ketika semua tugas yang dikirimkan selesai, Anda harus memiliki daftar lengkap dengan semua objek dari file.

  1. CopyOnWriteArrayList Saya tidak bisa menggunakannya karena membuat salinan pada setiap penulisan jadi beban akan terlalu banyak di memori ArrayList : Saya bisa menggunakan baru
  2. ArrayList untuk setiap tugas dan masukkan objek yang dibaca oleh tugas dalam lokal Araylist dan mengembalikannya sebagai Future. Ketika semua tugas selesai, saya akan menggabungkan semua ArrayList menjadi satu. Di sini tidak ada ArrayList sama dengan jumlah Tugas yang telah saya buat.

Apakah ada struktur data List bersamaan yang lebih baik yang dapat saya gunakan untuk menyimpan objek?

1
Koret 23 April 2021, 07:29

3 jawaban

Jawaban Terbaik

Tidak juga. Strategi ArrayList Anda sebaik yang didapat dan mis. setara dengan apa yang dilakukan parallelStream().collect(toList()).

0
Louis Wasserman 23 April 2021, 04:38

Anda dapat menggunakan cache/caffine jambu biji, karena file yang besar akan membuat lebih banyak gc.

0
liveM 23 April 2021, 06:55

CopyOnWriteArrayList mungkin bukan kandidat yang tepat untuk skenario ini

  1. Kasus penggunaan yang diberikan tampaknya berat menulis (hanya-tulis diikuti oleh hanya-baca)
  2. CopyOnWriteArrayList biasanya hanya mengizinkan satu penulis pada waktu tertentu (meskipun pembaca dapat dieksekusi secara bersamaan)

Dalam skenario, menggunakan CopyOnWriteArrayList mungkin memiliki kinerja yang lebih buruk daripada synchronizedList atau Vector. Ref SO:syncdList

Untuk kasus penggunaan saat ini, seperti yang ditunjukkan oleh @Louis Wasserman, lebih baik untuk mengisi daftar terisolasi di setiap utas dan akhirnya menggabungkan daftar.

  1. langkah kombinasi dapat memakan waktu/ruang karena realokasi.
  2. dapat sedikit dioptimalkan untuk waktu/ruang dengan menginisialisasi daftar hasil dengan ukuran gabungan dari masing-masing daftar (hindari pengubahan ukuran hasil secara internal)
0
Horse 23 April 2021, 05:03