Эффективный способ анализа больших объемов данных?
Мне нужно проанализировать десятки тысяч строк данных. Данные импортируются из текстового файла. Каждая строка данных имеет восемь переменных. В настоящее время я использую класс для определения структуры данных. Когда я прочитал текстовый файл, я сохраняю каждый объект линии в общем списке List.
Мне интересно, следует ли мне переключиться на использование реляционной базы данных (SQL), поскольку мне нужно будет анализировать данные в каждой строке текста, пытаясь связать их с терминами определения, которые я также храню в общих списках (List).
Цель состоит в том, чтобы перевести большой объем данных с помощью определений. Я хочу, чтобы определенные данные были фильтруемыми, доступными для поиска и т.д. Использование базы данных имеет больше смысла, чем больше я думаю об этом, но я бы хотел подтвердить более опытные разработчики, прежде чем я внес изменения, но снова (я использовал структуры и сначала arraylists).
Единственным недостатком, о котором я могу думать, является то, что данные не нужно сохранять после того, как он был переведен и просмотрен пользователем. Нет необходимости в постоянном хранении данных, поэтому использование базы данных может немного переборщить.
Ответы
Ответ 1
Не обязательно обращаться к базе данных. Это зависит от фактического размера данных и процесса, который вам нужно выполнить. Если вы загружаете данные в список с помощью специального класса, почему бы не использовать Linq для выполнения запросов и фильтрации? Что-то вроде:
var query = from foo in List<Foo>
where foo.Prop = criteriaVar
select foo;
Реальный вопрос заключается в том, насколько эти данные настолько велики, что их невозможно загружать в память. Если это так, то да, база данных будет намного проще.
Ответ 2
Это не большой объем данных. Я не вижу причин привлекать базу данных в ваш анализ.
Существует язык запросов, встроенный в С# - LINQ. Исходный плакат в настоящее время использует список объектов, поэтому на самом деле ничего не остается. Мне кажется, что база данных в этой ситуации добавит гораздо больше тепла, чем свет.
Ответ 3
Похоже, что вам нужна база данных. Sqlite поддерживает базы данных в памяти (используйте ": memory:" в качестве имени файла). Я подозреваю, что другие могут иметь режим памяти.
Ответ 4
Я столкнулся с той же проблемой, с которой вы столкнулись сейчас, когда я работал над своей предыдущей компанией. Дело в том, что я искал конкретное и хорошее решение для большого количества созданных штриховым кодом файлов. Штрих-код генерирует текстовый файл с тысячи записей в одном файле. Вначале создание и представление данных было настолько сложным для меня. Основываясь на записях, что я запрограммировал, я создаю класс, который читает файл и загружает данные в таблицу данных и может сохранить его в базе данных. В базе данных я использовал SQL-сервер 2005. Тогда я могу легко управлять сохраненными данными и представлять их, каким образом мне это нравится. Главное - прочитать данные из файла и сохранить в нем базу данных. Если вы это сделаете поэтому у вас будет много возможностей манипулировать и представлять как способ, которым вам это нравится.
Ответ 5
Если вы не против использования доступа, вот что вы можете сделать
Прикрепите пустой доступ db как ресурс
При необходимости напишите файл db в файл.
Запустите оператор CREATE TABLE, который обрабатывает столбцы ваших данных
Импорт данных в новую таблицу
Используйте sql для выполнения ваших расчетов
OnClose, удалите этот доступ db.
Вы можете использовать программу, такую как Resourcer, для загрузки db в файл resx.
ResourceManager res = new ResourceManager( "MyProject.blank_db", this.GetType().Assembly );
byte[] b = (byte[])res.GetObject( "access.blank" );
Затем используйте следующий код, чтобы вывести ресурс из проекта. Возьмите массив байтов и сохраните его в временном расположении с именем temp filename
"MyProject.blank_db" - это местоположение и имя файла ресурсов
"access.blank" - вкладка, предоставленная ресурсу для сохранения
Ответ 6
Если вам нужно только выполнить поиск и заменить, вы можете использовать sed и awk, и вы можете выполнять поиск с помощью grep. Конечно, на платформе Unix.
Ответ 7
Из вашего описания, я думаю, что инструменты командной строки Linux могут очень хорошо обрабатывать ваши данные. Использование базы данных может излишне усложнить вашу работу. Если вы используете окна, эти инструменты также доступны различными способами. Я бы порекомендовал cygwin. Следующие инструменты могут охватывать вашу задачу: sort, grep, cut, awk, sed, join, paste.
Эти инструменты командной строки unix/linux могут выглядеть страшно для человека Windows, но есть причины для людей, которые их любят. Вот мои причины любить их:
- Они позволяют вашему умению накапливаться - ваши знания частично помогли в различных будущих задачах.
- Они позволяют ваши усилия накапливаться - командная строка (или скрипты), которую вы использовали для завершения задачи, может повторяться столько раз, сколько необходимо с разными данными, без взаимодействия с человеком.
- Они обычно превосходят тот же инструмент, который вы можете написать. Если вы не верите, попробуйте выполнить сортировку с вашей версией для файлов терабайта.