질문
현재 id
)及其附加数据集从 SQL 表读取到无序映射中。这些数据集过去以 id
1로 시작하는 고유 식별자 시스템이 있지만 데이터세트를 추가하고 제거하는 데는 약 10밀리초가 걸립니다. 모든 데이터세트가 항상 RAM에 로드되는 것은 아닙니다.
순서에 공백이 있고 언젠가는 오버플로됩니다. SELECT MAX(id)
,并继续向计数器变量添加 +1,该变量将用作任何添加的数据集的 id
。已删除数据集的 id
s 不再在任何地方使用。这不可避免地会导致 id
가치관의 가장 낮은 격차를 메울 수 있는 효율적인 방법을 찾고 있습니다. 또한 부분적으로 로드된 SQL 테이블 및 프로그램 메모리와도 일치합니다. 메모리의 데이터가 SQL 테이블에 저장되는 데 몇 분 또는 즉시 걸릴 수 있습니다. id
생각
내가 생각해낸 한 가지 해결책은 SQL 테이블에서 가장 작은 간격을 찾기 위해 런타임에 생성된 각 데이터 세트에 대해 값비싼 쿼리를 수행하고, 이 가 순서가 지정되지 않은 맵에 값으로 존재하는지 확인한 다음 다시 변수의 카운터를 다음과 같이 사용하는 것이었습니다. 끝없는 쿼리를 피하기 위해 무료로 백업하세요 id
是否作为无序映射中的值存在,然后再次使用来自计数器变量作为备份,以避免无休止地查询免费的 id
。这完全适用于 1 id
. 이는 정확히 수량 1
id
,直到向量为空,然后(或经常)对更多 ID 进行新查询。但我想不出一个查询来查找表中 X 数量的间隙,该表可能有也可能没有以 1 开头的 id
또한 무료 ID 목록을 벡터로 쿼리하고 벡터가 비어 있을 때까지 새 데이터세트에 대해 이를
열이 있을 수도 있고 없을 수도 있는 X개의 간격을 찾는 쿼리는 생각할 수 없습니다. mo
和 mi
사용을 이해할 수 없습니다. userdata
的表,其中包含 id
和 dataset
列,均为 32 位带符号 INT。如何在 id
列中找到一系列间隙?例如,当表中的 id
및 dataset
열을 포함하는 userdata
라는 테이블이 있다고 가정합니다.
10밀리초마다 데이터베이스가 변경된다면 초당 100번 변경되는 것입니다. 서명된
int
에는 약 2,147,483,648개의 값, 즉 21,474,846초(약 8개월)를 저장할 수 있습니다. 이후에는 새로운 ID를 사용하실 수 없습니다.첫 번째 해결책은 대신
64bit
유형을 사용하는 것입니다64bit
类型而不是int
. 이는 약 13,600년(서명된 64b의 경우)을 제공하므로 충분해 보입니다. :)다른 해결책은 가능한 모든 ID를 포함하는 벡터를 갖는 것입니다. 벡터 저장소
bool
(ID 사용/미사용). 새 ID를 요청하려면 벡터를 사용되지 않은 것으로 표시된 첫 번째 위치로 이동하면 됩니다.이 벡터는 많은 RAM을 사용하지만 std::Vector에는 더 적은 RAM이 필요한 bool용 버전이 있습니다.
세 번째 해결 방법은 삭제된(읽기: 재사용 가능) ID의 연결 목록(이중 연결 가능)을 저장하는 작업을 처리하는 것입니다.
새 ID를 요청할 때 목록은 헤더를 제공하거나 목록이 비어 있는 경우 테이블 크기를 제공합니다.
데이터세트가 삭제되면 해당 ID가 목록에 올바르게 삽입되므로 목록이 항상 정렬됩니다.
ID를 재사용하면 목록에서 삭제됩니다.
테이블의 마지막 레코드를 삭제하면 목록의 마지막 노드도 쓸모가 없으므로 삭제될 수 있습니다(케이스 ID > 테이블 크기). 그렇기 때문에 마지막 노드를 빠르게 제거할 수 있도록 이중 연결 목록을 사용하는 것이 좋습니다.
그래서 목록은 노드에서 "새로 만들기"와 "삭제"를 빠르게 사용하고, 새 노드를 삽입하기 위해 자주 위아래로(이중 링크의 경우) 실행됩니다.
좀 느리긴 하지만 목록이 너무 크지 않고 소요 시간도 나쁘지 않길 바랍니다.
또한 이 목록에는 필요한 공백이 나열되어 있습니다.