Rumah > pembangunan bahagian belakang > Golang > Pemetaan serentak dengan hirisan dalam golang

Pemetaan serentak dengan hirisan dalam golang

WBOY
Lepaskan: 2024-02-11 09:57:09
ke hadapan
1169 orang telah melayarinya

golang 中带有切片的并发映射

editor php Banana membawakan artikel menarik tentang pemetaan serentak hirisan di golang. Dalam artikel ini, kita akan melihat cara menggunakan kepingan untuk operasi pemetaan dalam persekitaran serentak dan menerangkan sebab kepingan sangat berguna dalam pengaturcaraan serentak. Dengan menggunakan mekanisme konkurensi golang, kami boleh mengakses dan mengubah suai kepingan dalam berbilang goroutin pada masa yang sama, dengan itu meningkatkan prestasi dan kecekapan program. Sama ada anda seorang pemula atau pembangun golang yang berpengalaman, artikel ini akan membawa anda pengetahuan yang berharga dan kemahiran praktikal. Mari terokai pemetaan serentak dengan kepingan dalam golang!

Kandungan soalan

Saya telah cuba menyelesaikan isu konkurensi selepas salah seorang pembangun dalam bidang itu pergi beberapa bulan yang lalu, tetapi saya tidak dapat mencari cara yang betul untuk menyelesaikan masalah ini.

Untuk konteks, kami memuatkan data pelanggan ke dalam struktur seperti ini:

[ 键 ] -> { 值 }

[客户特定哈希] -> {数据点/文件切片}

Contoh - pemformatan yang sangat teruk, maaf:

[a60d849ad97bfb833e1096941] 
-> 
{ 
 { StartDate: '01-02-2022', EndDate: '28-02-2022', DataFrames: [1598,921578,12981,21749,192578...]},
 { StartDate: '01-03-2022', EndDate: '28-03-2022', DataFrames: [1234,1567,6781,126978...]},
}
Salin selepas log masuk

Perkara di atas adalah kerana kami mempunyai 100,000 pelanggan dan setiap malam kami memulakan proses untuk menyatukan data berdasarkan hash setiap pelanggan (atau sebenarnya baldi). Sebelum memproses bingkai data, kami mengulangi kepingan dan "mencantumkan" bingkai data menjadi satu bingkai data besar yang mengandungi banyak peraturan undang-undang/perakaunan.

Ia berjalan dalam goroutine untuk mengindeks semua titik data secepat mungkin.

Jadi pelaksanaannya pada dasarnya adalah sync.Map[string, []DataFrame] Tetapi saya perhatikan bahawa sementara operasi peta dilindungi, penambahan pada kepingan bingkai data tidak. Setiap cincang mungkin mempunyai sekitar 20-30 rujukan fail dalam kepingan itu setiap malam.

Ada peluang yang baik bahawa data pelanggan telah digabungkan secara tidak betul sejak dua tahun lalu dan saya ditugaskan untuk membetulkannya. Sebelum sync.map, mereka sekali lagi menggunakan RWMutex dengan Map, tetapi tidak menghiris, yang menunjukkan kepada artikel ini sebagai panduan.

Pertama sekali, adakah idea Peta yang mengandungi kepingan merupakan struktur data yang sesuai?

Saya cuba mencipta pengendali kepingan berdasarkan RWMutex tetapi tertanya-tanya sama ada Peta boleh memilikinya chan DataFrame 来代替在索引客户文件时放入,然后一旦完成,第二步将其合并到一个数组中(如len(chanx)) adakah ia akan diketahui?

Saya terutamanya dari Jawa jadi saya mungkin keliru dengan beberapa istilah jadi saya minta maaf.

Penyelesaian

Anda mempunyai dua masalah berbeza:

  1. Isu concurrency berlaku semasa mengemas kini peta
  2. Isu concurrency semasa mengemas kini entri peta

sync.Map akan menghalang 1, tetapi bukan 2.

Salah satu cara untuk menyelesaikan masalah ini ialah:

sync.Map[string, *DFrame]
Salin selepas log masuk

Di mana

type DFrame struct {
  sync.RWMutex 
  Data []DataFrame
}
Salin selepas log masuk

Sebaik sahaja anda mendapat entri daripada peta, anda harus LockRLock 它,然后使用数据。这不仅仅限于切片的附加。即使您只从数据帧中读取,您也必须 RLock strukturnya.

Jadi jika anda ingin menambah bingkai data baharu:

df := &DFrame{}
entry,_:=m.LoadOrStore(key, df)
dfEntry:=entry.(*DFrame)
dfEntry.Lock()
dfEntry.Data=append(dfEntry.Data, newDataFrame)
dfEntry.Unlock()
Salin selepas log masuk

Atas ialah kandungan terperinci Pemetaan serentak dengan hirisan dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan