Cara yang cekap untuk mengisi nilai yang hilang dalam peta tidak tersusun dari jadual SQL (SQL/C++)
P粉476547076
P粉476547076 2024-04-04 11:47:44
0
1
509

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

Apabila program bermula, ia membaca dari pangkalan data

Terdapat jurang dalam urutan dan satu hari ia akan melimpah. SELECT MAX(id) ,并继续向计数器变量添加 +1,该变量将用作任何添加的数据集的 id 。已删除数据集的 ids 不再在任何地方使用。这不可避免地会导致 id

Saya sedang mencari cara berprestasi untuk mengisi jurang terendah dalam nilai

. 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

. Kemudian ia kekal bebas dalam SQL, tetapi diambil dalam peta tidak tersusun sehingga memori disimpan semula.

id ,直到向量为空,然后(或经常)对更多 ID 进行新查询。但我想不出一个查询来查找表中 X 数量的间隙,该表可能有也可能没有以 1 开头的 idSaya juga bercadang cara untuk menanyakan senarai ID percuma ke dalam vektor dan menggunakannya sebagai

untuk set data baharu sehingga vektor kosong dan kemudian (atau selalunya) membuat pertanyaan baharu untuk lebih banyak ID. Tetapi saya tidak dapat memikirkan pertanyaan untuk mencari bilangan X jurang dalam jadual yang mungkin atau mungkin tidak mempunyai

lajur bermula dengan 1. momi

Saya terjumpa Bagaimana untuk mencari "jurang" semasa menjalankan kaunter menggunakan SQL? , tetapi saya mempunyai dua masalah dengan jawapan teratas: Nampaknya, ia hanya menemui satu jurang, sedangkan saya memerlukan banyak jurang, dan saya tidak dapat memahami penggunaannya

. userdata 的表,其中包含 iddataset 列,均为 32 位带符号 INT。如何在 id 列中找到一系列间隙?例如,当表中的 id

Andaikan saya mempunyai jadual bernama data pengguna yang mengandungi lajur

dan set data, kedua-duanya INT bertandatangan 32-bit. Bagaimana untuk mencari satu siri jurang dalam lajur

? Contohnya, apabila 🎜s dalam jadual ialah 1,6,7,9, saya mahu pertanyaan mengembalikan 2,3,4,5,8. 🎜 🎜Sebarang petunjuk kepada penyelesaian yang mungkin juga akan dihargai. 🎜
P粉476547076
P粉476547076

membalas semua(1)
P粉252423906

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan