Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
1

QProgressBar считывания большого файла

12.01.2015, 22:35. Показов 5887. Ответов 47
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть большой текстовый файл (.txt). Строки там представляют собой числа разделенные запятой: 1,1112,68... строки разной длинны.
Перед тем как передать данные в модель считываю их в QList<QStringList>.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    while(!in.atEnd())
    {
        Row = in.readLine();                                          //QString
        RowList = Row.split(",");                                    //QStringList
        switch (RowList.at(0).toInt(&ok))
        {
            case 1:
            {
                List_1.append(RowList);                               //QList<QStringList>
                RowList.clear();
                break;
            }
            case 2:
            {
                List_2.append(RowList);                              //QList<QStringList>
                RowList.clear();
                break;
            }
            case 3:
            {
                list_3.append(RowList);                                //QList<QStringList>
                RowList.clear();
                break;
            }
           default:
                break;
        }
 
        QStringList a = Row.split(",");
        List_All.append(a);                                            //QList<QStringList>
        RowList.clear();
        Row.clear();
    }
Файлы для считывания бывают разные, бывают 5Mb, а бывают 60-200Mb.
Хотелось бы сделать QProgressBar, что бы было видно, считывает файл программа или зависла.
Вопрос, что считать максимальным числом?
1) сначала пройтись по всему файлу и считать в переменную количество строк(узнать их максимальное количество в файле), а уж потом зная их количество, считывать данные (снова проходиться по файлу).
2) в свойствах файла изначально узнать его объем в мегабайтах (это и будет максимальное значение), а потом считывая строку - узнавать ее (объем, делить на объем файла) *100?

Или как-то проще можно сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2015, 22:35
Ответы с готовыми решениями:

Создать программу считывания произвольного файла и создание нового нетипизированного файла, копируя блоками
Создать программу считывания произвольного файла и создание нового нетипизированного файла, копируя...

Считывания из файла
помогите считать файл в методе read_file() #include&lt;iostream&gt; #include&lt;math.h&gt; #include...

Считывания с файла
При попытке считать цифры с файла:...

Считывания из файла в структуру
Скажите как из текстового файла счиать данные и превратить их в структуру на С

47
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
05.10.2016, 08:39 41
Author24 — интернет-сервис помощи студентам
Xantrax,
Ну если ты перед этим еще и выбор делаешь, тогда тут только два раза читать.

для поиска первой запятой никакой split тебе не нужен.
Обращаешься напрямую к данным через data() и потом например через memcpy копируешь кусок памяти в int

Добавлено через 1 минуту
Я не предлагал в int конвертировать, можно в строку сложить, все от максимального количества байт зависит. Вообщем куда то скопировать, а потом сравнивать.
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
05.10.2016, 08:51 42
1. Если читаешь файл по байтам, делишь длину файла на сто (нужно заранее знать длинну файла), сравниваешь полученное число с количеством прочитанных байт - получаешь индикатор в процентах. Если за время чтения/записи длинного файла 100 раз вызовешь QApplication::processEvents(); - катастрофы не случится, программа сильно не замедлится.

2. В вашем случае - как уже было сказано ранее, через каждые 100 или 500 или 1000 прочитанных строк выводить на экран счётчик. Число подобрать методом тыка, что-бы циферки на экране "красиво менялись". Например приблизительно раз в полсекунды - секунду. Если слишком быстро будут мелькать - замедлится процесс чтения, если медленно - будет неинформативно.

3. Через каждые 100 или 500 или 1000 прочитанных строк выводить на экран выводить на экран системное время - будут часики тикать. Или, если вычесть время старта - будет тикать уже время чтения файла.


КСТАТИ: при чтении старыми методами (fread, fwrite) можно получить длину файла не читая его - ставишь указатель на конец файла, и в указателе будет длина в байтах. Как сделать это современными способами, с помощью QFile?
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,671
05.10.2016, 09:23 43
Цитата Сообщение от alexu_007 Посмотреть сообщение
Как сделать это современными способами, с помощью QFile?
size()
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
05.10.2016, 11:42 44
Цитата Сообщение от Xantrax Посмотреть сообщение
Уважаемые знатоки, подскажите, все же, как бы оптимизировать время (скорость) считывания текстового файла?
Итак, у меня есть текстовый файл. Внутри файла строки из цифр, цифры разделены запятыми. Длина строки пока не более 250 символов. Объем файла может быть разным, от десятков мегабайт до нескольких гигабайт. Представить файл в бинарном виде не могу, так как не знаю структуру всех строк начинающихся с нужной мне цифры.
Пример строк в файле:
202,1234,768,367.005,654,789
30000, 1235, 756, 369.567, 654, 999
Несколько гб, тем более десятков гб тупо в память к тебе не влезут. Ты уж начинай с чего-нить реального, а не с фантастики. Научись сперва с средненькими файлами работать.

Разделитель между строками какой? Возврат каретки + перевод строки? Если файл стандартный текстовый, то его наверное можно прочитать стандартными средствами работы с текстом - открыть как текстовый, прочитать по строкам. Если нестандартный, то читаешь по байтам до признака конца строки. Либо читаешь блоками по 1024 байта (например) и распарсиваешь прочитанное - так наверное быстрее будет. Но сложнее.

Если гигабайты цифр хранятся в текстовом формате, то это характеризует уровень мастерства программиста, писавшего такие программы. Что ты тут ускорять собираешься? Переформатируй файлы, чтобы числа хоть в int хранились, потом можно будет говорить о скорости чтения.
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
06.10.2016, 09:16  [ТС] 45
Цитата Сообщение от alexu_007 Посмотреть сообщение
Несколько гб, тем более десятков гб тупо в память к тебе не влезут.
Если внимательно читать данную тему, то я об этом не один раз упоминал, что файл размером от 1 гигабайта пихать в оперативну
память не стоит.
Цитата Сообщение от alexu_007 Посмотреть сообщение
Разделитель между строками какой?
Да, возврат каретки и перевод строки.
Цитата Сообщение от alexu_007 Посмотреть сообщение
Переформатируй файлы, чтобы числа хоть в int хранились
Чем отличается файл txt, где хранятся числа от файла txt в котором хранятся числа? Всегда думал, что существует два типа файлов, либо текстовый, либо двоичный...
0
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
06.10.2016, 10:19 46
Xantrax,
Цитата Сообщение от Xantrax Посмотреть сообщение
Чем отличается файл txt, где хранятся числа от файла txt в котором хранятся числа?
Для примера число 301989887
При записи его как число занимает 4 байта
При записи его как текст занимает 9 байт
Есть разница?
Не говоря уже о длительности преобразований и сравнений текстовых чисел.
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
06.10.2016, 10:53 47
Цитата Сообщение от Xantrax Посмотреть сообщение
Если внимательно читать данную тему, то я об этом не один раз упоминал, что файл размером от 1 гигабайта пихать в оперативную память не стоит.
Но ты же хочешь читать файлы в неск гб - куда?

Добавлено через 3 минуты
Цитата Сообщение от solar_wind Посмотреть сообщение
Для примера число 301989887
При записи его как число занимает 4 байта
При записи его как текст занимает 9 байт
Есть разница?
Плюс запятая между числами тоже 1 байт занимает, совершенно бесполезно.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.10.2016, 11:10 48
Цитата Сообщение от Xantrax Посмотреть сообщение
Предлагаю, для хранения "первых чисел" и отступов от начала файла до этих строк использовать такую структуру:
QPair<QList<int>,QList<long long>>messages;
где
в QList<int>,будут храниться "первые сообщения", в порядке, в котором они хранятся в исходном файле;
в QList<long long>, будут храниться отступы до этих сообщений от начала файла...
C++ (Qt)
1
2
3
4
5
6
7
struct LineInfo
{
   int firstNumber;
   qulonglong linePosition;
}; 
 
typedef QVector<LineInfo> LineInfos;
0
06.10.2016, 11:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2016, 11:10
Помогаю со студенческими работами здесь

Считывания файла пословно
Ребят, как считать пословно текст из файла, getline не подходит.

Оптимизация считывания файла
Здравствуйте! Хочу считать файл побайтно. Как лучше оптимизировать программу? Может...

Ошибка считывания с файла
Всем доброго времени суток! Не понимаю, почему в функции button1_Click компилятор ругается на...

Ошибка считывания из файла
Столкнулся с ошибкой чтения в переменную. Нажимаю на кнопочку &quot;insetsave&quot; - сохранение переменной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
48
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru