Как осуществить чтение больших файлов на QT?

Приветствую.

На QT пишу редко, отсюда незнание особенностей.
Столкнулся с проблемой при чтении файлов, размер которых превышает 1.5Гб.

Предположим, имеется текстовый файл размером 2 Гб, хочу впихнуть его в память в виде хеш-таблицы.
В качестве примера:
QString line;

    QFile mfile("bigfile.txt");
    if(!mfile.open(QIODevice::ReadOnly))
           qDebug() << "Error opening file";
    QTextStream in(&mfile);
    QHash<QString, quint64> myHash;
    quint64 c = 0;
    do {
        c++;
        line = in.readLine();
        myHash.insert(line, c);
    } while (!line.isNull());


Дело в том, что когда приложение набирает около 1300 мб, вылетает ошибка.
4dee37afdcc3075c89ce0b7f510432.jpg

Судя по всему, это защита ОС.
Хотелось бы услышать правильное решение проблемы.

Основная задача - это создать что-то вроде массива/хеш таблицы для удобной работы с элементами, удаление дублей, сортировка и т.д.
Заранее спасибо.
  • Вопрос задан
  • 5202 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Lol4t0
У вас просто закончилась память.

32-битному приложению на x86 архитектуре доступно по умолчанию 2 ГБ пользовательской памяти. С учетом того, что в эту же память замплен код самого приложения и библиотек, и фрагментации кучи - числа порядка 1.5 ГБ - практический потолок использования памяти.

Или думайте, как уменьшить расход памяти - или переходите на 64 бита.
Ответ написан
Комментировать
AxisPod
@AxisPod
Не знаю как в QT, копайте в сторону отображения файлов в память.
Ответ написан
Комментировать
Trrrrr
@Trrrrr
А что вам надо конкретно делать?
Вы в состоянии обрабатывать данные по мере загрузки файла?
Какраз отображать файл в память не следует если он очень большой, можно использовать fopen fread по частям.

У меня есть подозрение что не в файле дело а в банальной нехватке памяти, поэтмоу просто попробуйте собраться под х64
Ответ написан
Комментировать
@xseven
Смущает сама постановка задачи.

В Qt нет никаких возможностей для работы с большими файлами (если не ошибаюсь были обертки над mmap для *nix и аналогом для Win)

В общем случае вам надо отобразить большой файл в память для чтения
Отобразить файл для записи
Читать и писать из источника в приемник
Подход вполне жизнеспособен (существуют альтернативы)

Можно посмотреть в сторону HDF5
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы