Обработка ошибок и заголовки не включены. Вам необходимо предоставить DataType
и cmpfunc
, образцы предоставляются. Вы должны быть в состоянии вывести основные работы из этого фрагмента:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
typedef char DataType; // is this alphanumeric?
int cmpfunc(char const *left, char const *right)
{
return *right - *left;
}
int main(int argc, char **argv)
{
int fd = open(argv[1], O_RDWR|O_LARGEFILE);
if (fd == -1)
return 1;
struct stat st;
if (fstat(fd, &st) != 0)
return 1;
DataType *data = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (!data)
return 1;
qsort(data, st.st_size / sizeof(*data), cmpfunc);
if (0 != msync(data, st.st_size, MS_SYNC))
return 1;
if (-1 == munmap(data, st.st_size))
return 1;
if (0 != close(fd))
return 1;
return 0;
}
Я не могу себе представить, что вы можете получить намного быстрее, чем это. Убедитесь, что у вас достаточно адресного пространства виртуальной памяти (его использует 1,5 ГБ, но, вероятно, он будет работать только на 32-битной Linux, вы сможете управлять этим на любой 64-битной ОС). Обратите внимание, что этот код «ограничен» работой в POSIX-совместимой системе.
С точки зрения C и эффективности этот подход предоставляет всю операционную систему в руки ОС и превосходному алгоритму qsort
.