как получить большой файл - PullRequest
1 голос
/ 30 августа 2010

Я работаю над приложением, в котором мне нужно сравнить 10 ^ 8 записей (буквенно-цифровые записи). Чтобы извлечь записи из файла (размер файла составляет 1,5 ГБ), а затем сравнить их, мне нужно менее 5 минут времени. Итак, что было бы эффективным способом сделать это, поскольку только время извлечения превышает 5 минут. И мне нужно работать только с файлом. Пожалуйста, предложите выход. Я работаю на Windows с 3 ГБ ОЗУ и 100 ГБ жесткого диска.

Ответы [ 3 ]

5 голосов
/ 30 августа 2010
  • Считать часть файла, отсортировать его, записать во временный файл.
  • Объединить-отсортировать полученные файлы.
1 голос
/ 30 августа 2010

Обработка ошибок и заголовки не включены. Вам необходимо предоставить 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.

0 голосов
/ 30 августа 2010

Если время извлечения превышает 5 минут, похоже, вам нужно посмотреть, как вы читаете этот файл.Одна вещь, которая привела к плохой производительности для меня, это то, что реализация C иногда использует поточно-ориентированные операции ввода-вывода по умолчанию, и вы можете получить некоторую скорость, используя небезопасный ввод-вывод.на компьютере это будет работать?Многие компьютеры в настоящее время имеют несколько гигабайт памяти, поэтому, возможно, будет достаточно просто прочитать все это в память и затем отсортировать ее там (например, с помощью qsort)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...