Soalan
Pada masa ini terdapat sistem untuk pengecam unik bermula dengan id
)及其附加数据集从 SQL 表读取到无序映射中。这些数据集过去以 id
1, tetapi penambahan dan pengalihan keluar set data mengambil masa kira-kira 10 milisaat Ambil perhatian bahawa tidak semua set data sentiasa dimuatkan ke dalam RAM
Terdapat jurang dalam urutan dan satu hari ia akan melimpah. SELECT MAX(id)
,并继续向计数器变量添加 +1,该变量将用作任何添加的数据集的 id
。已删除数据集的 id
s 不再在任何地方使用。这不可避免地会导致 id
. Juga konsisten dengan hanya sebahagian jadual SQL dan memori program yang dimuatkan. Data dalam ingatan mungkin mengambil masa beberapa minit atau serta-merta untuk disimpan ke jadual SQL. id
Fikiran
Satu penyelesaian yang saya temukan ialah melakukan pertanyaan mahal pada setiap set data yang dibuat pada masa jalan untuk mencari jurang terkecil dalam jadual SQL, semak sama ada ini wujud sebagai nilai dalam peta tidak tertib, dan kemudian sekali lagi gunakan pembilang daripada Pembolehubah sebagai sandaran untuk mengelakkan pertanyaan yang tidak berkesudahan secara percuma id
是否作为无序映射中的值存在,然后再次使用来自计数器变量作为备份,以避免无休止地查询免费的 id
。这完全适用于 1 id
. Ini terpakai tepat pada kuantiti 1
id
,直到向量为空,然后(或经常)对更多 ID 进行新查询。但我想不出一个查询来查找表中 X 数量的间隙,该表可能有也可能没有以 1 开头的 id
Saya juga bercadang cara untuk menanyakan senarai ID percuma ke dalam vektor dan menggunakannya sebagai
lajur bermula dengan 1. mo
和 mi
. userdata
的表,其中包含 id
和 dataset
列,均为 32 位带符号 INT。如何在 id
列中找到一系列间隙?例如,当表中的 id
data pengguna
yang mengandungi lajur dan set data
, kedua-duanya INT bertandatangan 32-bit. Bagaimana untuk mencari satu siri jurang dalam lajur
Jika terdapat pertukaran pangkalan data setiap 10 milisaat, itu adalah 100 perubahan sesaat.
int
yang ditandatangani boleh menyimpan kira-kira 2,147,483,648 nilai atau 21,474,846 saat, iaitu lebih kurang 8 bulan. Selepas ini, ID baharu tidak mungkin tersedia.Penyelesaian pertama adalah dengan menggunakan taip
64bit
64bit
类型而不是int
. Ini memberi anda kira-kira 13,600 tahun (untuk 64b yang ditandatangani), yang nampaknya cukup :)Penyelesaian lain ialah mempunyai vektor yang mengandungi semua ID yang mungkin. Storan vektor
bool
(ID digunakan/tidak digunakan). Meminta ID baharu dilakukan dengan mengalihkan vektor ke kedudukan pertama yang ditandai sebagai tidak digunakan.Vektor ini menggunakan banyak RAM, walaupun std::vector mempunyai versi khusus untuk bool yang memerlukan kurang RAM.
Penyelesaian ketiga ialah berurusan dengan menyimpan senarai terpaut (mungkin dipautkan dua kali ganda) ID yang dipadamkan (baca: boleh diguna semula).
Apabila meminta ID baharu, senarai memberikan pengepalanya atau saiz jadual jika senarai itu kosong.
Apabila set data dipadamkan, IDnya dimasukkan dengan betul ke dalam senarai, jadi senarai itu sentiasa diisih.
Apabila ID digunakan semula, ia akan dialih keluar daripada senarai.
Memadamkan rekod terakhir dalam jadual juga boleh memadamkan nod terakhir dalam senarai kerana ia tidak berguna (ID kes > saiz jadual). Itulah sebabnya saya mengesyorkan menggunakan senarai pautan berganda supaya nod terakhir boleh dialih keluar dengan cepat.
Jadi senarai menggunakan "baharu" dan "padam" pada nodnya dengan cepat, dan juga berjalan ke atas dan ke bawah (untuk dua pautan) dengan kerap untuk memasukkan nod baharu.
Ini agak lambat, tetapi saya harap senarai itu tidak terlalu besar dan masa yang diperlukan tidak teruk.
Juga ambil perhatian bahawa senarai ini memberi anda pelbagai jurang yang anda perlukan.