Je suis mmaping deux fichiers texte avec un entier écrit sur chaque ligne. Je les lis depuis le lecteur et je voulais faire une fusion triée sur eux. Les deux fichiers d'entrée "1piece0" et "1piece1" ont une liste d'entiers triés. Le fichier de sortie a la taille en tant que les deux fichiers combinés, mais pas beaucoup d'entiers. Problème: Les deux fichiers d'entrée ont 25430000 lignes, tandis que le fichier de sortie doit contenir 50860000 lignes, mais il n'a que 17259463 lignes. Ceci est mon code actuel.std :: fusionner en utilisant 2 matrices mmaped?
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <algorithm>
#define FILESIZE 25430000 * sizeof(int)
#define FILE0 279288034
#define FILE1 279287226
int main()
{
int i;
int fd;
int fd2;
int fd3;
int result;
int *map;
int *map2;
int *map3;
fd3 = open("file.out", O_RDWR | O_CREAT | O_TRUNC, (mode_t)0755);
if (fd3 == -1) {
perror("Error opening file for writing");
exit(EXIT_FAILURE);
}
result = lseek(fd3, FILE0 + FILE1 - 1, SEEK_SET);
if(result == -1) {
close(fd);
perror("Error calling lseek\n");
exit(EXIT_FAILURE);
}
result = write(fd3,"",1);
if(result != 1) {
close(fd3);
perror("error writing last byte");
exit(EXIT_FAILURE);
}
map3 =(int *) mmap(0, FILE0 + FILE1, PROT_READ | PROT_WRITE, MAP_SHARED, fd3, 0);
if(map == MAP_FAILED) {
close(fd);
perror("Error mmapinG fd3");
exit(EXIT_FAILURE);
}
fd = open("1piece0", O_RDONLY);
if(fd == -1) {
perror("Error opening file for writing");
exit(EXIT_FAILURE);
}
map = (int *)mmap(0, FILE0, PROT_READ, MAP_SHARED, fd, 0);
if(map == MAP_FAILED) {
close(fd);
perror("error mapping file");
exit(EXIT_FAILURE);
}
fd2 = open("1piece1", O_RDONLY);
if(fd2 == -1) {
perror("Error opening file for writing");
exit(EXIT_FAILURE);
}
map2 = (int *)mmap(0, FILE1, PROT_READ, MAP_SHARED, fd2, 0);
if(map == MAP_FAILED) {
close(fd2);
perror("error mapping file");
exit(EXIT_FAILURE);
}
// while(1);
std::merge(map, map + 25430000, map2, map2 + 25430000, map3);
if(munmap(map, FILE0) == -1) {
perror("error unmapping map");
}
close(fd);
if(munmap(map3, FILE0 + FILE1) == -1) {
perror("error unmapping map3");
}
close(fd3);
if(munmap(map2, FILE1) == -1) {
perror("error unmapping map2");
}
close(fd2);
return 0;
}
Pouvez-vous s'il vous plaît me dire ce que je fais mal?
Mise à jour: Par lignes, je veux dire un nombre entier, puis un caractère de nouvelle ligne.
Parlez-nous de ce qui se passe mal. –
@Jens - Well Les fichiers sont sous la forme d'un entier puis d'un caractère de retour à la ligne. Donc, je voulais trier les fusionner. Je pense que je ne peux pas les mmap. Le problème exact est qu'il ne semble pas y avoir assez de lignes dans le fichier de sortie. –
La condition if à côté de map2 et map3 ne devrait-elle pas être vérifiée par rapport à map2 et map3, au lieu de map? – yasouser