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

Pemetaan serentak dengan hirisan dalam golang

WBOY
WBOYke hadapan
2024-02-11 09:57:091098semak imbas

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...]},
}

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]

Di mana

type DFrame struct {
  sync.RWMutex 
  Data []DataFrame
}

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()

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

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam