[C++] [gcc] odczyt dużych (64G) plików binarnych

0

Witam,
mam taki oto problem:
jest sobie plik binarny o wielkości ok 64G bądź więcej. Ja muszę czytać po 4 bity i umieszczać je w 3 wektorach (ale to już mniej ważne).

Jako iż muszę wczytać znaczną część tego pliku (do 8G) do pamięci, to chciałem się zapytać:

Jaka jest najwydajniejsza metoda do operacji czytania pliku binarnego (przy czym muszę "przelecieć" praktycznie cały plik) i czy czytanie nie będzie szybsze jeżeli napiszę je w C bądź asmie.

pozdr

0

może funkcją mmap?

http://pl.wikipedia.org/wiki/Mmap

0

No właśnie nie do końca.
Problem jest taki, że w tym dużym pliku jest macierz rzadka. Ja muszę ją transponować i dzielić na paski (max po 8G). Z tego co zrozumiałem, to mmap odwzorowuje ciągłą część pliku, co mnie się przyda ewentualnie później, jak te 8-gigowe paski będę przetwarzał dalej.

0

mmap tez moze przydac Ci sie w tym, zeby wczytywac partie danych z tego pliku obrabiac, wczytac kolejna partie itd.. asm chyba nie potrezbny, wczytywanie po 4 bity sprowadzisz do czytania po bajcie + jeden and z maska + jedno przesuniecie bitowe, potem tylko otrzymane kawalki logicznie powstawiac do wynikowych. jesli chcesz szybciej - sprawdz jakie masz rejestry na procku - 32 czy 64 czy 128 bit? w przypadku nr 1 mozesz wtedy "przepaławiać" po 4 bajty na raz etc. i jakie wektory wyjsciowe masz na mysli? bo po poodczytywaniu po 4 bity --- btw na pewno bity a nie bajty? -- zapisywac musisz i tak do min. bajtu, wiec wszystko 'urosnie' conajmniej dwukrotnie..

hm.. a moze to program na jakies współbiegi i do puszczenia na klastzre, hm..? to wtedy wszystkie operacje musisz z lekka pod tym katem opracowac, nawet to to czytanie z pliku.. memmap wtedy Ci ulatwi dzieki prostemu pokawalkowaniu pliku

0

No widzisz, ja już pierdziele głupoty :)
Mam jeszcze projekcik z AVRem i mi się te bity jakoś nasunęły...

Oczywiście są to bajty i kolejne pozycje wczytywane z pliku są zapisane na 4 bajtach.

czasami sam się boję jak czytam bzdety, które piszę :P

No a co do klastrów, to samo dzielenie macierzy na paski, transponowanie ma robić ten główny procesor, a na stacje robocze są potem przesyłane te paski i coś tam się z nimi potem dzieje, ale na razie mam tą macierz obrobić i chciałbym, żeby to jak najszybciej i najsprawniej działało.

Sam program działa tak, że wczytuje tą macierz do pamięci i przechowuje w 3 wektorach (obiekty klasy vector najprawdopodobniej). W pierwszym są wartości, w drugim kolumny, a trzeci wektor przechowuje ilość elementów niezerowych w każdym kolejnym wierszu.

0

W pierwszym są wartości, w drugim kolumny

nie za bardzo rozumiem..

0

No w pliku dane są zapisane tak (po 4 bajty):
[ilość el. niezer. w wierszu] [wart] [kolumna] [wart] [kolumna] ... [ilość el. niezer. w wierszu] [wart] [kolumna]...

No i ja to wczytuje do 3 wektorów:

  1. [wart] [wart] [wart] ...
  2. [kolu] [kolu] [kolu] ...
  3. ilosc el. niezerowych w poszczególnych (kolejnych) wierszach.

//q: aaaaahhhh, macierz RZADKA... okej, lampka mi sie zapalila :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1