Duuuuża tablica w visualu

Duuuuża tablica w visualu
YooSy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 472
0

getline() daj do w warunku pętli, bo teraz jest potencjalne ryzyko błędu. Nie sprawdzasz po pobraniu wiersza, czy udało się pobrać dane.
Gdyby się nie udało, dalsze obliczenia nie mają sensu.

Kopiuj
while(getline(plik,linia))
    {
        zmienna=atof(linia.c_str());
        //Algorytm(zmienna,a)
    }

Choć do czytania danych z pliku binarnego wygodniej i szybciej jest użyć metody read().
Przykłady były w linkach ze stacka.

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2518
0

czytanie tekstu:

Kopiuj
  FILE* f = fopen("nazwa.txt", "r");
  double d;
  while (fscanf(f, "%lf", &d) == 1) {
    printf("licz_staty(%lf)\n", d);
  }
  fclose(f);

do otworzenia binarnie zamiast "r" zrób "rb", do zapisu "wb" a przy czytaniu read i write

Nie mieszaj stdio.h z iostream

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

mnie tylko interesuję

Interesuje. Zadziwiające, jak po latach ciągłego czytania błędów w drugą stronę (brak ę tam gdzie być powinno) ostatnio jest wysyp nadmiarowych ę.
</grammar_nazi>

Jeśli plik masz jeden, ale będziesz go wielokrotnie wykorzystywał, przekonwertuj plik z postaci tekstowej na binarną. Samo użycie ios::binary tego automagicznie nie robi.
Wczytaj plik tak jak wczytujesz, i zapisz dane do nowego pliku - klasa ofstream, metoda write.
Plik wynikowy powinien mieć około rozmiar około 4 GB (każdy double to 8 bajtów).

Późniejsze wczytanie takiego pliku powinno zająć sekundy, a nie minuty.

tajny_agent
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1340
0
mastasso napisał(a):
tajny_agent napisał(a):

Podpowiedzi już dostałeś: format binarny, wczytywanie/przetwarzanie blokowe, wątki.
Dopóki nie zdradzisz tych tajnych algorytmów lub tego, w jaki sposób dane są powiązane to żadnej konkretniejszej odpowiedzi nie dostaniesz.

ależ algorytmy nie są tajne, to głównie testy statystyczne oraz dobór optymalnych parametrów - one nie mają nic wspólnego z moim pytaniem, moje pytanie jest ogólne i myślę że ten wątek może w przyszłości się wielu przydać mnie tylko interesuję szybki odczyt ok 500mln wartości

Ależ jak najbardziej ma to związek. To w jaki sposób będziesz te dane przetwarzał determinuje jak i ile danych wczytać. W erze wielordzeniowych procesorów aż się prosi, żeby przetwarzanie takiej ilości danych porozdzielać na mniejsze fragmenty. Nie ma najmniejszego sensu ładować 500mln wartości do pamięci, skoro zdecydowana większość będzie leżała odłogiem i czekała kilkanaście czy nawet kilkadziesiąt sekund na przetworzenie.

mastasso
  • Rejestracja: dni
  • Ostatnio: dni
0

mam problem:
zapis do pliku bin:

Kopiuj
ifstream plik_od("C:/plik.csv");
ofstream plik_zap("C:/plik.bin",ios::binary);

/....
	while(! plik_od.eof())
	{
	..	getline(plik_od,linia,'.');
		zmienna=atof(linia.c_str());
		plik_zap.write(reinterpret_cast<char*>(&zmienna), sizeof(double));
		 

i odczyt

Kopiuj

ifstream plik("C:/plik.bin",ios::binary);

while(! plik.eof())
	{
		
		getline(plik,linia);
		cena=atof(linia.c_str());
		cout<<zmienna<<endl;
		

i wcztuje same zera......co jest nie tak?:((

  • Rejestracja: dni
  • Ostatnio: dni
0
mastasso napisał(a):

Przy zapisie i odczycie masz atof czyli ascii to float, potem musisz float to ascii zrobić, tylko nie wiem czy chcesz mnie printable zapis czy odwrotnie bo odwrotnie jest mniej pamięciożerne, ale nie idzie potem modyfikować z notatnika.

mastasso
  • Rejestracja: dni
  • Ostatnio: dni
0
Krzywy Ogórek napisał(a):
mastasso napisał(a):

Przy zapisie i odczycie masz atof czyli ascii to float, potem musisz float to ascii zrobić, tylko nie wiem czy chcesz mnie printable zapis czy odwrotnie bo odwrotnie jest mniej pamięciożerne, ale nie idzie potem modyfikować z notatnika.

ja notatnikia nie potrzebuję (jak chcę sprawdzić warość to wyświetlam cout).
nie rozumiem, jak zapisuję to zapisuję float, ale otczytując chyba i tak odczytuję string, czy się mylę?
to jak to zastąpić aby działało bo się pogubiłem:(

  • Rejestracja: dni
  • Ostatnio: dni
0

Normalnie byle jak zapisz bez tego atof i potem odczytaj bez tego tak samo.

Jedynie przy wyświetlaniu sobie robisz formatowanie jak ma to wyglądać.

Jak to decymalna to dajesz %d, jak rzeczywista to %f.

Jak masz c++ to cout samo zrobi za ciebie formatowanie.

mastasso
  • Rejestracja: dni
  • Ostatnio: dni
0
Krzywy Ogórek napisał(a):

Normalnie byle jak zapisz bez tego atof i potem odczytaj bez tego tak samo.

Jedynie przy wyświetlaniu sobie robisz formatowanie jak ma to wyglądać.

Jak to decymalna to dajesz %d, jak rzeczywista to %f.

Jak masz c++ to cout samo zrobi za ciebie formatowanie.

odczytując muszę mieć double bo potem na zmiennej liczę....jak piszę:
plik_zap.write(linia.c_str(), sizeof(double));
to ten plik mogę otworzyć notepadem (a przy bianrnym zap powinny byc krzczki), do tego są nieprawidłowości, np puste linie itd. które nie wiem skąd się biorą....

YooSy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 472
1

Jeśli już korzystasz z C++, nie ma potrzeby czytania stringa i konwersji na liczbę.

Kopiuj
double zmienna;
while(plik_od >> zmienna)
{
    // tutaj coś robisz z tą zmienną    
    plik_zap.write(reinterpret_cast<char*>(&zmienna), sizeof(double));
    plik.get(); // odrzucenie kropki
}

https://4programmers.net/Pastebin/8301

mastasso
  • Rejestracja: dni
  • Ostatnio: dni
0
YooSy napisał(a):

Jeśli już korzystasz z C++, nie ma potrzeby czytania stringa i konwersji na liczbę.

Kopiuj
double zmienna;
while(plik_od >> zmienna)
{
    // tutaj coś robisz z tą zmienną    
    plik_zap.write(reinterpret_cast<char*>(&zmienna), sizeof(double));
    plik.get(); // odrzucenie kropki
}

korzystam z visuala c++......nie rozumiem getline(plik,linia); wymaga aby linia była strigiem!!! Jak niby inaczej to zrobić?

YooSy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 472
0

getline(plik_od,linia,'.'); pobiera linię do terminatora, czyli u ciebie była ustawiona kropka, którą odrzuca po wczytaniu i zwraca strumień.
Patrz dokumentacja. http://en.cppreference.com/w/cpp/string/basic_string/getline

Czy to plik czy konsola getline() traktuje wszystko jak tekst. Właściwie wszystko jest tekstem.
To co my widzimy jest dla nas liczbą, ale dla pliku jest to tekst i to od nas zależy
jak chcemy zinterpretować te dane.
np. 1,2345
getline(plik, zmienna); pobierze jako teks i trzeba się z tym później barować.
double zmienna; plik >> zmienna; operator >> sam potrafi poprawnie interpretować te dane i da nam poprawnie wczytaną wartość żądanego typu double.
W obu przypadkach: czy to funkcja std::getlien czy operator>> zwracany jest strumień, więc można ich użyć w warunku pętli.
Obiekt trumienia jest odpowiednio rzutowany na typ bool.

YooSy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 472
1

nie rozumiem getline(plik,linia); wymaga aby linia była strigiem!!!

My stosując funkcję getline chcemy, żeby dane były traktowane jako string.

Jak niby inaczej to zrobić?

Tak ja dałem w przykładzie, czyli od razy czytamy dane do zmiennej liczbowej operatorem >>.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.