我正在为sqlite数据库中的点开发一个简单的存储,问题是磁盘上的空间消耗略微不满意。这就是我的意思:
为数据库生成一些数据的程序:
#include <cstdlib>
#include <cstdint>
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) {
double lat = 180*(rand()*1.0/RAND_MAX);
double lon = 180*(rand()*1.0/RAND_MAX);
int64_t id = rand()*1LL*rand();
cout << id << "," << lat << "," << lon << "\n";
}
return 0;
}
导入数据运行:
g++ filldb.cpp
echo 100000 | ./a.out > db.text
sqlite3 test.db
sqlite> create table points(id UNSIGNED INT, lat REAL, lon REAL);
sqlite> .separator ,
sqlite> .mode csv
sqlite> .import db.text points
此后的数据库大小显示3.3M
,但&#34;真实&#34;数据大小为100000 *(8字节)* 3 = 2.4M
且在
sqlite> create index points_index on points(id);
数据库大小增加一倍以上5.1M
Q 空间在哪里(我不是指索引的空间,而是存储数据的开销)以及如何控制存储/索引的低级行为,并且可以做到了吗?
点数据库只是一个例子,我希望存储类似id -> payload
映射的内容,其中有效负载大小事先已知,并且每个id都相同。