Potrzebuję zbudować indeks dla bardzo dużego (50GB +) pliku tekstowego ASCII, który pozwoli mi zapewnić szybki losowy dostęp do odczytu do pliku (uzyskać n-tą linię, dostać n-tą słowo w n-tą linię). Postanowiłem użyć List<List<long>> map
, gdzie element map[i][j]
jest pozycją jth słowa i-tej linii w pliku.struktura danych do indeksowania dużego pliku
Utworzę indeks po kolei, tzn. Odczytuję cały plik i wypełniam indeks przy pomocy map.Add(new List<long>())
(nowa linia) i map[i].Add(position)
(nowe słowo). Następnie odzyskaję określoną pozycję słowa przy pomocy map[i][j]
.
Jedyny problem jaki widzę to to, że nie mogę przewidzieć całkowitej liczby linii/słów, więc wpadnę na O (n) przy każdej realokacji List
, nie mam pojęcia, jak mogę tego uniknąć.
Czy są jakieś inne problemy ze strukturą danych wybraną do zadania? Która struktura może być lepsza?
UPD: Plik nie zostanie zmieniony w czasie wykonywania. Nie ma innych sposobów na pobieranie treści poza wymienionymi na liście.
Tylko wyjaśnić - czy ten plik się zmieni? Będziesz mieć do niego dostęp tylko przez X wiersza Y, czy będziesz musiał szukać na przykład przez słowo? – Haedrian
@ Haedrian, patrz aktualizacja. – vorou