mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-05 18:05:42 +02:00
Memory map the metadata pool too
This commit is contained in:
@@ -212,52 +212,50 @@ void parse_geometry(int t, json_object *j, unsigned *bbox, long long *fpos, FILE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int deserialize_int(FILE *f, int *n) {
|
void deserialize_int(char **f, int *n) {
|
||||||
if (fread(n, sizeof(int), 1, f) <= 0) {
|
memcpy(n, *f, sizeof(int));
|
||||||
return 0;
|
*f += sizeof(int);
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void deserialize_string(FILE *f) {
|
void deserialize_string(char **f) {
|
||||||
int len;
|
int len;
|
||||||
deserialize_int(f, &len);
|
deserialize_int(f, &len);
|
||||||
char s[len + 1];
|
char s[len + 1];
|
||||||
fread(s, sizeof(char), len, f);
|
memcpy(s, *f, len);
|
||||||
|
*f += len;
|
||||||
s[len] = '\0';
|
s[len] = '\0';
|
||||||
printf("%s", s);
|
printf("%s", s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void check(struct index *ix, long long n) {
|
void check(struct index *ix, long long n, char *metabase) {
|
||||||
FILE *f = fopen("meta.out", "rb");
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
printf("%llx ", ix[i].index);
|
printf("%llx ", ix[i].index);
|
||||||
|
|
||||||
off_t pos = ix[i].fpos;
|
char *meta = metabase + ix[i].fpos;
|
||||||
fseeko(f, pos, SEEK_SET);
|
|
||||||
|
|
||||||
int m;
|
int m;
|
||||||
deserialize_int(f, &m);
|
deserialize_int(&meta, &m);
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
int t;
|
int t;
|
||||||
deserialize_int(f, &t);
|
deserialize_int(&meta, &t);
|
||||||
printf("(%d) ", t);
|
printf("(%d) ", t);
|
||||||
deserialize_string(f);
|
deserialize_string(&meta);
|
||||||
printf("=");
|
printf("=");
|
||||||
deserialize_string(f);
|
deserialize_string(&meta);
|
||||||
printf("; ");
|
printf("; ");
|
||||||
}
|
}
|
||||||
|
|
||||||
int t;
|
int t;
|
||||||
deserialize_int(f, &t);
|
deserialize_int(&meta, &t);
|
||||||
printf("(%d) ", t);
|
printf("(%d) ", t);
|
||||||
|
|
||||||
while (deserialize_int(f, &t)) {
|
while (1) {
|
||||||
|
deserialize_int(&meta, &t);
|
||||||
|
|
||||||
if (t == VT_END) {
|
if (t == VT_END) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -266,8 +264,8 @@ void check(struct index *ix, long long n) {
|
|||||||
|
|
||||||
if (t == VT_MOVETO || t == VT_LINETO) {
|
if (t == VT_MOVETO || t == VT_LINETO) {
|
||||||
int x, y;
|
int x, y;
|
||||||
deserialize_int(f, &x);
|
deserialize_int(&meta, &x);
|
||||||
deserialize_int(f, &y);
|
deserialize_int(&meta, &y);
|
||||||
|
|
||||||
printf("%x,%x ", x, y);
|
printf("%x,%x ", x, y);
|
||||||
}
|
}
|
||||||
@@ -408,11 +406,22 @@ next_feature:
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mfd = open("meta.out", O_RDWR);
|
||||||
|
struct stat mst;
|
||||||
|
fstat(mfd, &mst);
|
||||||
|
char *meta = mmap(NULL, mst.st_size, PROT_READ, MAP_PRIVATE, mfd, 0);
|
||||||
|
if (meta == MAP_FAILED) {
|
||||||
|
perror("mmap meta");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
qsort(index, st.st_size / sizeof(struct index), sizeof(struct index), indexcmp);
|
qsort(index, st.st_size / sizeof(struct index), sizeof(struct index), indexcmp);
|
||||||
check(index, st.st_size / sizeof(struct index));
|
check(index, st.st_size / sizeof(struct index), meta);
|
||||||
|
|
||||||
munmap(index, st.st_size);
|
munmap(index, st.st_size);
|
||||||
|
munmap(meta, mst.st_size);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
close(mfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|||||||
Reference in New Issue
Block a user