2010-02-28 22 views
10

Potrzebuję przeanalizować dziesiątki tysięcy linii danych. Dane są importowane z pliku tekstowego. Każda linia danych ma osiem zmiennych. Obecnie używam klasy do definiowania struktury danych. Podczas czytania pliku tekstowego przechowuję każdy obiekt linii na ogólnej liście: Lista.Wydajny sposób analizowania dużych ilości danych?

Zastanawiam się, czy powinienem przełączyć się na korzystanie z relacyjnej bazy danych (SQL), ponieważ będę musiał przeanalizować dane w każdym wierszu tekstu, próbując powiązać je z terminami definicji, które również przechowuję na ogólnych listach (lista).

Celem jest przetłumaczenie dużej ilości danych za pomocą definicji. Chcę, aby zdefiniowane dane były możliwe do filtrowania, wyszukiwania itp. Używanie bazy danych ma więcej sensu, im więcej o tym myślę, ale chciałbym potwierdzić bardziej doświadczonymi programistami, zanim wprowadzę zmiany, jeszcze raz (użyłem struktur i najpierw listy układów).

Jedyną wadą, jaką mogę wymyślić, jest to, że dane nie muszą być przechowywane po przetłumaczeniu i przejrzeniu przez użytkownika. Nie ma potrzeby stałego przechowywania danych, dlatego korzystanie z bazy danych może być trochę przesadą.

Odpowiedz

3

Nie jest absolutnie konieczne, aby przejść do bazy danych. To zależy od faktycznego rozmiaru danych i procesu, który musisz wykonać. Jeśli ładujesz dane do listy z niestandardową klasą, dlaczego nie używać Linq do wykonywania zapytań i filtrowania? Coś jak:

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

Prawdziwe pytanie brzmi, czy dane jest tak duża, że ​​nie może być załadowany do pamięci komfortowo. Jeśli tak jest, to tak, baza danych byłaby znacznie prostsza.

+0

Pliki, które importuję, zawierają dziesiątki tysięcy linii, niektóre mogą zawierać ponad 100 tysięcy linii. Każda linia ma osiem pól, które należy przeanalizować i przetłumaczyć. Na przykład jedno pole może zawierać wartość "phy" i musi być przetłumaczone na "warstwę fizyczną" w oparciu o plik definicji. Próbuję znaleźć najbardziej efektywny sposób analizy i tłumaczenia tych danych. – Snooze

+0

Czy zamierzasz przeprowadzić analizę zbiorczą danych lub jest ona przetwarzana tylko linia po linii? Jeśli później, odczytanie pliku tekstowego i przetwarzanie w trakcie pracy może być dość szybkie w porównaniu z próbą pobrania danych do SQL Express lub Access. Mimo to umieszczenie go w bazie da ci pewien stopień elastyczności, na przykład możliwość tworzenia indeksów, które sam będziesz musiał sam sobie zakodować. – Thomas

+0

Myślę, że nie mam innego wyjścia, jak przeprowadzić analizę agregacyjną, ponieważ niektóre definicje zależą od wcześniejszych wierszy w plikach tekstowych. Co więcej, dzięki analizie zbiorczej mogę zmienić strukturę danych, aby były bardziej czytelne/łatwiejsze do zrozumienia. Nawet jeśli miałbym pracować w locie, nadal potrzebowałbym struktury danych, aby użytkownik mógł filtrować/przeszukiwać dane. – Snooze

1

Brzmi to, jak chcesz, to baza danych. Sqlite supports baz danych w pamięci (użyj ": memory:" jako nazwy pliku). Podejrzewam, że inni mogą mieć również tryb in-memory.

+0

To brzmi jak całkiem atrakcyjne rozwiązanie. Nie znam baz danych w pamięci, więc będę musiał przeprowadzić moje badania, ale Sqlite brzmi jak system lekki (sądząc po nazwisku). – Snooze

+1

SQLite, pomimo szumu, nie radzi sobie z danymi tak dobrze w milionach. Dziesiątki tysięcy, nie wiem, to zależy. Upewnij się, że indeksujesz go w prawo. Wypróbuj duży rozmiar strony. Jeśli podejrzewasz, że może wzrosnąć do większej ilości danych, nie angażuj się w SQLite! Wiem z doświadczenia. – MPelletier

+0

Tak, jest lite i dostajesz to, za co płacisz. Używałem go do małych rzeczy i niektórych rzeczy w setkach tysięcy. Ponadto nie jest tak naprawdę bezpieczny dla wątków. –

0

Jeśli nie przeszkadza Ci dostęp, o to co można zrobić

Dołączanie pusty Access DB jako zasób Gdy trzeba napisać db się złożyć. Uruchom instrukcję CREATE TABLE, która obsługuje kolumny danych. Zaimportuj dane do nowej tabeli Użyj sql, aby wykonać obliczenia Włącz, zamknij, usuń ten dostęp do bazy danych.

Można użyć programu jak Resourcer załadować db do pliku RESX

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

Następnie należy użyć następującego kodu, aby wyciągnąć z zasobów projektu. Wziąć tablicę bajtów i zapisać go do lokalizacji pliku temp przy temp

„MyProject.blank_db” jest lokalizacja i nazwa pliku zasobów „access.blank” jest zakładka podane do zasobu zapisać

+0

BTW, to samo działa z SQL Server Compact Edition, który jest dostarczany z Visual Studio 2008. –

+0

Myślę, że wolałbym użyć rozwiązania SQL w pamięci, ale będę musiał zrobić moje badania. – Snooze

1

Miałem do czynienia z tym samym problemem, z którym się spotkałeś podczas pracy nad moją poprzednią firmą. Chodzi o to, że szukałem konkretnego i dobrego rozwiązania dla wielu plików generowanych przez kody kreskowe. Kod paskowy generuje plik tekstowy z tysiącami rekordów w jednym pliku. Na początku manipulowanie i prezentowanie danych było dla mnie tak trudne. Na podstawie zapisów, które zaprogramowałem, tworzę klasę, która odczytuje plik i ładuje dane do tabeli danych i jest w stanie aby zapisać go w bazie danych. Bazą danych, której używałem, był SQL Server 2005. Następnie mogę łatwo zarządzać zapisanymi danymi i prezentować je w taki sposób, jak mi się podoba. Głównym punktem jest odczyt danych z pliku i zapisanie go w bazie danych.Jeśli to zrobisz, będziesz miał wiele opcji do manipulowania i prezentowania, tak jak lubisz.

3

To nie jest duża ilość danych. Nie widzę powodu, aby włączać bazę danych do analizy.

Istnieje język zapytań wbudowany w C# - LINQ. Oryginalny plakat używa obecnie listy obiektów, więc nie ma już nic do zrobienia. Wydaje mi się, że baza danych w tej sytuacji dodawałaby znacznie więcej ciepła niż światła.

+0

W przypadku języka zapytań, więc nie trzeba tak mocno kodować takich rzeczy (lub wymyślać samemu)? –

+1

@jeffamaphone - istnieje język zapytań wbudowany w C# - LINQ. Oryginalny plakat używa obecnie listy obiektów, więc nie ma już nic do zrobienia. Wydaje mi się, że baza danych w tej sytuacji dodawałaby znacznie więcej ciepła niż światła. –

+1

Dobra uwaga. Powinieneś umieścić to w swojej odpowiedzi. –

0

Jeśli jedyną rzeczą, którą musisz zrobić, to przeszukać i wymienić, możesz rozważyć użycie sed i awk i możesz wyszukiwać używając grep. Oczywiście na platformie Unix.

+0

Na Windowsie msys i cygwin mogą dać ci sed i awk. – ecounysis

0

Z twojego opisu, myślę, że narzędzia linii poleceń linux potrafią bardzo dobrze obsługiwać twoje dane. Używanie bazy danych może niepotrzebnie komplikować twoją pracę. Jeśli korzystasz z systemu Windows, narzędzia te są również dostępne na różne sposoby. Polecam cygwin. Następujące narzędzia mogą obejmować twoje zadanie: sort, grep, cut, awk, sed, join, paste.

Te narzędzia wiersza poleceń systemu Unix/Linux mogą wyglądać groźnie dla osoby korzystającej z systemu Windows, ale istnieją powody dla osób, które je kochają. Oto moje powody, dla których je kocham:

  1. Pozwalają one gromadzić umiejętności - twoja wiedza do częściowego narzędzia może być pomocna w różnych przyszłych zadaniach.
  2. Umożliwiają one gromadzenie danych - wiersz polecenia (lub skrypty) użyte do zakończenia zadania można powtarzać tyle razy, ile potrzeba, przy różnych danych, bez interakcji z innymi użytkownikami.
  3. Zwykle przewyższają to samo narzędzie, które można pisać. Jeśli nie wierzysz, spróbuj porozmawiać z wersją dla plików terabajtowych.
Powiązane problemy