@Cobret

Как мне визуализировать огромное количество данных из xml-файла?

Привет. Я начинающий UWP - C# разработчик. Я бы хотел чтобы моя первая программа могла сохранять записи пользователя для дальнейшей обработки. Все данные в строковом виде я решил записывать и сохранять в xml файл. Но сейчас я думаю над тем что если пользователь не будет ограничен в количестве создаваемых записей тогда их будет настолько много что я не знаю как их потом лучше визуализировать и чтобы программа не зависла при запуске.

Предположим количество записей будет около миллиона и тогда я хотел бы знать:
1. Смогу ли я загрузить файл для чтения и сохранить все нужные данные для начала в XmlNodeList чтобы потом перебирать и визуализировать частями?
2. Если я не могу такое огромное количество одновременно записать в XmlNodeList как мне тогда их получать из файла? Создать несколько файлов?
3. Если мне удалось извлечь необходимые мне данные из файла и сохранить их в памяти классами для дальнейшей обработки, то как мне визуализировать лучше всего это частями? Первое что приходит на ум визуализировать их по 200 или 300 или любым другим числом и запоминать индекс последнего и добавлять остальных по мере прокрутки страницы? Но самая большая загвоздка в том что пользователь может фильтровать или сортировать записи по своему усмотрению (по алфавиту, по дате или по другим признакам) как мне тогда запомнить последний визуализированный элемент?

Как лучше всего поступить в этой ситуации, чтобы сохранить производительность но чтобы и не ограничивать число записей?

-- Также хотел бы упомянуть что я решил визуализировать записи с помощью специальных UserControl, без ListView или GridView.
  • Вопрос задан
  • 146 просмотров
Пригласить эксперта
Ответы на вопрос 5
Ваша история выглядит примерно так:
1. Я по непонятным мне самому критериям выбрал язык разметки как формат для хранения данных.
2. Задумался, что он таки не очень хорошо подходит для этой задачи
3. Я хочу продолжать использовать этот формат, но хочу избавиться от проблем.

Я думаю, вам стоит в принципе попробовать другой формат.
Например, если у вас имеется очень много данных, над которыми потом надо производить аналитику - вам может подойти формат Parquet - он изначально для бигдаты и спарка придуман.

Раз нужно много разных сортировок и фильтраций - можно попробовать, например, sqlite или другую, более полновесную СУБД.

Если всё-таки хотите остаться на XML, то посмотрите в сторону поточного чтения документа с последующим преобразованием в какое-то внутреннее представление, с которым ваша программа сможет работать эффективнее (по сути вы так изобретёте свою СУБД на минималках с индексами и эффективной структурой)

Для поточного чтения можно попробовать класс XMLReader


Но самая большая загвоздка в том что пользователь может фильтровать или сортировать записи по своему усмотрению (по алфавиту, по дате или по другим признакам) как мне тогда запомнить последний визуализированный элемент?

Нужно сортировать все данные, а не только те что показаны - тогда смещение будет работать ровно так, как ожидается
Ответ написан
Комментировать
AlexNest
@AlexNest
Работаю с Python/Django
Вообще, я бы советовал посмотреть в сторону баз данных, т.к. они из коробки поддерживают выборку порциями.
Для небольшого приложения - подойдет sqlite, т.к. она встраивается в приложение и после попадания к пользователю не будет требовать установки каких бы то ни было программ связанных с БД.

Если все-таки нужно xml, то при работе с большими файлами лучше читать их построчно.
Upd: Вроде-как не совсем то. (см. комментарий)
(С шарпом не знаком, но поиск выдал класс streamreader и метод readline)
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
XML-файл обычно используют для очень сложной доменной структуры. С композицией документов. Типа есть документ. В нем - такие-же под-документы. А если у вас структура плоская - то лучше писать в плоский файл. CSV или log. Есть еще вариант JSONL (Json-lines) где каждая строчка - независимый документ. В последнем случае метаинформация будет более очевидна чем в лог-файле.

Чтоб быстрее искать - можно большой файл побить на порции по дате-времени например /yyyy-mm-dd/hh-MM.xml
Если индекс по алвафиту - то тоже можно завести параллельно структуру /index/a/yyyy-mm-dd/hh-MM.xml, /index/b.... и так далее.

Файловая система в этом смысле лучше чем БД. Т.к. цена поддержки - нулевая. Никаких доп-процессов не будет.
Ответ написан
NikFaraday
@NikFaraday
Student full-stack Developer
Используйте загрузку данных в некотором объёме. Допустим, настройте своеобразные страницы для просмотра (Типа сайта фильмов, они не загружаются все миллион, а страницами) и просто вытаскивайте из списка/массива от n индекса до m (m < length) и выводите на экран, или куда вам там надо) Можете так же настроить какие-то сортировки для большего удобства, что-то типа, вывести последних 200 штук
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
Используй базу данных
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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