Эффективный способ анализа больших объемов данных?

Мне нужно проанализировать десятки тысяч строк данных. Данные импортируются из текстового файла. Каждая строка данных имеет восемь переменных. В настоящее время я использую класс для определения структуры данных. Когда я читаю текстовый файл, я храню каждый объект строки В общем списке, списке.

Мне интересно, должен ли я переключиться на использование реляционной базы данных (SQL), поскольку мне нужно будет проанализировать данные в каждой строке текста, пытаясь связать его с определениями, которые я также храню в настоящее время общие списки (List).

цель-перевести большое количество определений данных. Я хочу определенные данные можно было найти, поиска и т. д. Использование базы данных имеет больше смысла, чем больше я думаю об этом, но я хотел бы подтвердить с более опытными разработчиками, прежде чем вносить изменения, еще раз (сначала я использовал структуры и arraylists).

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

7 ответов


не совсем обязательно идти в базу данных. Это зависит от фактического размера данных и процесса, который вам нужно сделать. Если вы загружаете данные в список с помощью пользовательского класса, почему бы не использовать Linq для запросов и фильтрации? Что-то вроде:

var query = from foo in List<Foo>
            where foo.Prop = criteriaVar
            select foo;

реальный вопрос заключается в том, являются ли данные настолько большими, что они не могут быть загружены в память. Если это так, то да, база данных была бы намного проще.


Это не большой объем данных. Я не вижу причин включать базу данных в ваш анализ.

существует язык запросов, встроенный в C# -- LINQ. Оригинальный плакат в настоящее время использует список объектов, поэтому делать действительно нечего. Мне кажется, что база данных в этой ситуации добавила бы гораздо больше тепла, чем света.


похоже, что вам нужна база данных. SQLite в поддерживает базы данных в памяти (используйте ":memory:" в качестве имени файла). Я подозреваю, что у других также может быть режим in-memory.


Я столкнулся с той же проблемой, с которой вы столкнулись сейчас, когда я работал в своей предыдущей компании.Дело в том, что я искал конкретное и хорошее решение для многих файлов, генерируемых штрих-кодом.Штрих-код генерирует текстовый файл с тысячами записей в одном файле.Поначалу мне было очень трудно манипулировать данными и представлять их.На основе записей, которые я запрограммировал, я создаю класс, который читает файл и загружает данные в таблицу данных и может сохранять их в базе данных. База данных, которую я использовал, была SQL server 2005.Затем я могу легко управлять сохраненными данными и представлять их так, как мне нравится.Главное-прочитать данные из файла и сохранить его в базу данных.Если вы это сделаете, у вас будет много вариантов для манипулирования и представления так, как вам нравится.


Если вы не против использовать access, вот что вы можете сделать

присоединить пустую БД доступа в качестве ресурса При необходимости запишите БД в файл. Запустите инструкцию CREATE TABLE, которая обрабатывает столбцы данных Импорт данных в новую таблицу Используйте sql для выполнения вычислений OnClose, удалите этот доступ к БД.

вы можете использовать такую программу, как Resourcer для загрузки БД в файл resx

  ResourceManager res = new ResourceManager( "MyProject.blank_db", this.GetType().Assembly );
  byte[] b = (byte[])res.GetObject( "access.blank" );

затем используйте следующий код, чтобы вытащить ресурс из проект. Возьмите массив байтов и сохраните его во временном расположении с именем файла temp

" MyProject.blank_db " - расположение и имя файла ресурса "доступ.blank " - вкладка, данная ресурсу для сохранения


Если единственное, что вам нужно сделать, это поиск и замена, вы можете использовать sed и awk, и вы можете выполнять поиск с помощью grep. Конечно, на платформе Unix.


из вашего описания я думаю, что инструменты командной строки linux могут очень хорошо обрабатывать ваши данные. Использование базы данных может излишне усложнить вашу работу. Если вы используете Windows, эти средства также можно по-разному. Я бы рекомендовал cygwin. Следующие инструменты могут покрыть вашу задачу: сортировать, grep, вырезать, awk, sed, join, paste.

эти инструменты командной строки unix/linux могут выглядеть страшно для человека windows, но есть причины для людей, которые любят их. Следующие мои причины их любви:

  1. они позволяют ваше умение накапливать-ваши знания частично инструмент может быть полезным в различных будущих задачах.
  2. они позволяют накапливать ваши усилия-командная строка (или скрипты), которую вы использовали для завершения задачи, может повторяться столько раз, сколько необходимо, с разными данными, без человеческого взаимодействия.
  3. они обычно превосходят тот же инструмент, который вы можете написать. Если вы не верите, попробуйте побить сортировку с вашей версией для терабайтные файлы.