2010-02-28 1 views
10

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

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

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

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

ответ

3

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

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

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

+0

Файлы, которые я импортирую, содержат десятки тысяч строк, некоторые могут охватывать более 100 тысяч строк. Каждая строка имеет восемь полей, которые необходимо проанализировать и перевести. Например, одно поле может содержать значение «phy» и должно быть переведено на «Physical Layer» на основе файла определения. Я пытаюсь выяснить наиболее эффективный способ анализа и перевода этих данных. – Snooze

+0

Собираетесь ли вы выполнять совокупный анализ данных или обрабатывать их только по очереди? Если позже, то чтение текстового файла и обработка по ходу дела могут быть довольно быстрыми, по сравнению с попыткой получить данные в SQL Express или Access. Тем не менее, поместить его в базу данных даст вам определенную гибкость, такую ​​как возможность создавать индексы, которые вы должны были бы закодировать самостоятельно. – Thomas

+0

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

1

Похоже, что вы хотите получить базу данных. Sqlite supports в базе данных (используйте «: memory:» в качестве имени файла). Я подозреваю, что у других может быть режим в памяти.

+0

Это звучит как довольно привлекательное решение. Я не очень хорошо знаком с базами данных в памяти, поэтому мне придется делать мои исследования, но Sqlite звучит как легкая система (судя по имени). – Snooze

+1

SQLite, несмотря на шумиху, не обрабатывает данные, что хорошо в миллионах. Десятки тысяч, я бы не знал, это зависит. Не забудьте проиндексировать его правильно. Попробуйте большой размер страницы. Если вы как-то подозреваете, что это может вырасти до большего количества данных, не делайте привязку к SQLite! Я знаю по опыту. – MPelletier

+0

Да, это просто, и вы получаете то, за что платите. Я использовал его для мелочей и некоторых вещей в сотнях тысяч. Кроме того, он не является поточно-безопасным. –

0

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

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

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

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

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

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

+0

BTW, то же самое работает с SQL Server Compact Edition, который поставляется с Visual Studio 2008. –

+0

Я думаю, что я предпочел бы использовать SQL-решение в памяти, но мне придется делать мои исследования. – Snooze

1

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

3

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

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

+0

Для языка запросов, поэтому вам не нужно жестко кодировать такие вещи (или изобретать их самостоятельно)? –

+1

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

+1

Хорошая точка. Вы должны положить это в свой ответ. –

0

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

+0

В Windows, msys и cygwin могут дать вам sed и awk. – ecounysis

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^