Russian Qt Forum
Ноябрь 27, 2024, 16:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Чем большой текст показать?  (Прочитано 38392 раз)
spectre71
Гость
« Ответ #15 : Ноябрь 26, 2009, 12:19 »

Ну вот что у меня получилось (attachment). В 2 словах это  viewer который не загружает весь файл в память, а работает "окном" (т.е. держит в памяти всего несколько страниц текста). В архиве также утилитка чтобы создавать текстовые файлы приличного размера (1 Gb и более). Проблемы:

- разумеется никаких шрифтов, html и.т.п - только plain text
- русского языка нет (может и можно сделать но я не знаю как)
- режим "wrap" (с переносом текста) вылетает. И многое для этого режима не сделано

Впечатления: "мало не показалось" Улыбающийся  Как оно часто бывает, на деле все сложнее чем сначала думалось

Не заработало. Показывает только первую строчку в файле.
Записан
BigZ
Гость
« Ответ #16 : Ноябрь 26, 2009, 12:44 »

Ну вот что у меня получилось (attachment). В 2 словах это  viewer который не загружает весь файл в память, а работает "окном" (т.е. держит в памяти всего несколько страниц текста). В архиве также утилитка чтобы создавать текстовые файлы приличного размера (1 Gb и более). Проблемы:

- разумеется никаких шрифтов, html и.т.п - только plain text
- русского языка нет (может и можно сделать но я не знаю как)
- режим "wrap" (с переносом текста) вылетает. И многое для этого режима не сделано

Впечатления: "мало не показалось" Улыбающийся  Как оно часто бывает, на деле все сложнее чем сначала думалось
Другой вариант воспользоваться QStringListModel (если строки в QStringList как в начальном условии), которую подключить к QTableView. Если лог ОЧЕНЬ! большой и в файле, то нужна своя модель в которой кол. строк равно кол. строк в файле.
P.S. Но я не знаю QTableView кеширует данные модели или нет, может память кушать.

Записан
spectre71
Гость
« Ответ #17 : Ноябрь 26, 2009, 13:07 »

Другой вариант воспользоваться QStringListModel (если строки в QStringList как в начальном условии), которую подключить к QTableView. Если лог ОЧЕНЬ! большой и в файле, то нужна своя модель в которой кол. строк равно кол. строк в файле.
P.S. Но я не знаю QTableView кеширует данные модели или нет, может память кушать.

Этот вариант в данном случае абсолютно не подходит.
Речь не о визуализации лога, а просмотрщике файлов. С Врапингом, селекцией участков текста итд.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Ноябрь 26, 2009, 17:57 »

Не заработало. Показывает только первую строчку в файле.
Не знаю как решить - у меня показывает все Непонимающий
Какой файл смотрите? Попробуйте с файлом созданным утилитой - я гонял на них
Записан
Павел_F.
Гость
« Ответ #19 : Ноябрь 27, 2009, 15:23 »

Добрался, наконец, до него еще раз. Что-то слепил.
Вариант предложенный Igors у меня компилится что-то не хочет...
Цитировать
MainWindow.o: In function `(anonymous namespace)::LoadDialog(QWidget*, char const*)':
MainWindow.cpp:(.text+0x1678): undefined reference to `QFormBuilder::QFormBuilder()'
MainWindow.cpp:(.text+0x172f): undefined reference to `QAbstractFormBuilder::load(QIODevice*, QWidget*)'
MainWindow.cpp:(.text+0x1754): undefined reference to `QFormBuilder::~QFormBuilder()'
MainWindow.cpp:(.text+0x1b59): undefined reference to `QFormBuilder::~QFormBuilder()'

Хотя особо не разбарался, не захотело и ладно.
« Последнее редактирование: Ноябрь 27, 2009, 15:26 от Павел_F. » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Ноябрь 27, 2009, 18:04 »

Добрался, наконец, до него еще раз. Что-то слепил.
Вариант предложенный Igors у меня компилится что-то не хочет...
Цитировать
MainWindow.o: In function `(anonymous namespace)::LoadDialog(QWidget*, char const*)':
MainWindow.cpp:(.text+0x1678): undefined reference to `QFormBuilder::QFormBuilder()'
MainWindow.cpp:(.text+0x172f): undefined reference to `QAbstractFormBuilder::load(QIODevice*, QWidget*)'
MainWindow.cpp:(.text+0x1754): undefined reference to `QFormBuilder::~QFormBuilder()'
MainWindow.cpp:(.text+0x1b59): undefined reference to `QFormBuilder::~QFormBuilder()'

Хотя особо не разбарался, не захотело и ладно.
Не хочет линковаться потому что нет либы QDesigner. Ну да ладно, "не разбарался" - так не разбарался Улыбающийся

В Вашем варианте не работает тетя Клава (нельзя выйти за пределы загруженной порции нажимая PgUp, PgDown или стрелки). Дело вкуса но мигание + индикация при таскании скроллбара по-моему не смотрятся. Навигацию и поиск видимо добавить придется. И еще позвольте заметить:

Цитировать
Что-то слепил.
Зачем так пренебрежительно говорить о своей работе над которой Вы сидели не один день? То что Вы сделали - совсем НЕ просто (сам проверял  Улыбающийся)
Записан
Павел_F.
Гость
« Ответ #21 : Ноябрь 27, 2009, 18:19 »

Не хочет линковаться потому что нет либы QDesigner.
Надо поставить, хотя пока не до этого.
В Вашем варианте не работает тетя Клава (нельзя выйти за пределы загруженной порции нажимая PgUp, PgDown или стрелки). Дело вкуса но мигание + индикация при таскании скроллбара по-моему не смотрятся. Навигацию и поиск видимо добавить придется.
Это понятно, я в описании и написал что только скролбар и колесо мыши. Тут от задачи все зависит. Если шаг большой поставить то индексироваться будет быстрее и памяти надо меньше а вот поиск строки будет долгим и без индикации прога выглядит "повисшей". Добавить нужно еще много чего и много чего переделать/пересмотреть... это "первый шаг".
Зачем так пренебрежительно говорить о своей работе над которой Вы сидели не один день? То что Вы сделали - совсем НЕ просто (сам проверял  Улыбающийся)
Потому что до приличного вида этому еще далеко. Да и сидел один день, точнее одни сутки Улыбающийся . Но согласен, не так просто как казалось...
« Последнее редактирование: Ноябрь 27, 2009, 18:23 от Павел_F. » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Ноябрь 27, 2009, 19:00 »

Тут от задачи все зависит. Если шаг большой поставить то индексироваться будет быстрее и памяти надо меньше а вот поиск строки будет долгим и без индикации прога выглядит "повисшей".
Я пробовал QTextStream но на гигабайтах он работает гнусно медленно. Прямое чтение в несколько раз быстрее. И, к сожалению, QTextStream не все концы строк понимает. С размером "шага" по-моему все ясно: число строк в экране умноженное на 3. То есть имеем запас - экран текста вверх, экран текста вниз.
Записан
Павел_F.
Гость
« Ответ #23 : Ноябрь 27, 2009, 20:10 »

У меня сначала читаются, но не хранятся, все строки по очереди ( для подсчета их кол-ва и заполнения массива индексов). Массив индексов это тупо массив целых чисел ( число это позиция строки в файле). В массиве я храню только строки с номерами кратными шагу ( например если шаг зададим 1000 то там будут 0-я, 1000-я, 2000-я и т.д.). Поэтому массив сравнительно не большой и его размер обратно пропорционален размеру шага. Далее, когда мне нужна строка с номером n, я n представляю для себя в виде step*k + m, ищу в массиве позицию строки с номером k, смещаюсь в файле на позицию строки k. И начиная с этой позиции ищу строку с номером m ( это и будет моя строка n). Время этого поиска мноооого меньше поиска по всему файлу( в худшем случае я переберу количество строк равное размеру шага) и прямо пропорционально размеру шага. Вот выбор размера шага... это только из опытов Улыбающийся

При таком подходе переход k строк вперед и на x*n + k занимает одинаковое время( k - количество строк, n - размер шага индексирования, х - любое целое). Т.е. я могу шагнуть на 1 строку и на 1001 за одинаковое время ( ну не совсем, но почти. разница во времени поиска в QList от использования которого думаю отказаться и времени смещения по файлу но это отдельная тема). при этом можно обойтись малым кол-вом памяти( порядка мегабайта при работе с трех гигабайтным файлом). И я не храню содержимое файла в памяти( только то что видно на экране и то уже в визуальном компоненте) и не реализовываю никакого упреждающего чтения. При моей задаче это важно и всякие QTextStream'ы тут совершенно не подходят.
При упреждающем чтении сложно смещаться сразу на много "страниц" я же без проблем получу "страницу" хоть из середины хоть сначала, хоть с конца ( и в получении этих "страниц" практически на будет разницы).
Понятие "шаг" у вас и у меня несут несколько разный смысл.

Хотя, как я говорил, это лишь "первое приближение" нужной вещи.
Далеко не всегда стоит так "мудрить". Если дело касается, например, просто листания и разглядывания файла то это совершенно не нужно.
PS: а вот с тем как QFile::readLine() определяет конец строки меня, видимо, еще ждет нехороший сюрприз...
« Последнее редактирование: Ноябрь 27, 2009, 20:26 от Павел_F. » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Ноябрь 27, 2009, 20:34 »

Мне кажется Вы перемудрили с оптимизацией пл памяти. Я храню тупо: строка - ее позиция в файле (qint64, 8 байт). Давайте прикинем: миллион строк (приличный текстовик) - съедается 8Mb. Это разумный расход памяти. Сократить в 2 раза - не вопрос, например

Код:
struct CIndex : public QVector <int> {
... 
qint64 LinePosition( int index ) { return mBasePosition[i / mBlockSize] + at(i); }
...
  QVector <qint64> mBasePosition;
};
Записан
Павел_F.
Гость
« Ответ #25 : Ноябрь 27, 2009, 20:40 »

"Бытие определяет сознание." (c)
Если памяти нет, то взять ее уже негде.
« Последнее редактирование: Ноябрь 27, 2009, 20:43 от Павел_F. » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Ноябрь 27, 2009, 20:54 »

"Бытие определяет сознание." (c)
Если памяти нет, то взять ее уже негде.
Да помилуйте, вот сегодня, здесь, обсуждал с человеком масштабирование картинки до размера типа 2000x2000 (это всего лишь 16 Mb). И это очень скромно по сегодняшним понятиям.
Записан
Павел_F.
Гость
« Ответ #27 : Ноябрь 27, 2009, 20:58 »

Ну это уже личное дело каждого.
Хотя, возможно, требования по расходу памяти не столь жестки как я их воспринял. И если это окажется так то я с радостью переделаю и не буду так "мудрить".
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #28 : Декабрь 14, 2009, 08:17 »

Igors, коррективы твоей программы:
во все pro-файлы добавить:
Код
C++ (Qt)
CONFIG += designer

в генератор файлов, в функции Generate заменить строку:
Код
C++ (Qt)
s += lst[RandInt(0, lst.size())];
на
Код
C++ (Qt)
s += lst[RandInt(0, lst.size()-1)];
иначе во время генерации крашится по ASSERT'у в QList
Записан

Юра.
daimon
Гость
« Ответ #29 : Декабрь 14, 2009, 10:58 »

Просматиривая большой файл (300 метров), возникла ошибка при перемещении ползунка скрола мышой (debug показал ошибку в qvector.h -> inline bool isEmpty() const { return d->size == 0;} )
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.107 секунд. Запросов: 23.