Zapis do pliku [problem rozmiaru w pamięci]
Ostatnio zmodyfikowano 2017-03-08 22:01
Kinexity Temat założony przez niniejszego użytkownika |
Zapis do pliku [problem rozmiaru w pamięci] » 2017-03-08 21:30:18 Witam kolegów programistów! Mam taki problem z zakresu zapisywania do pliku: mianowicie stworzyłem na potrzeby własne program, który prowadzi różne obliczenia, między innymi poszukuje liczb pierwszych, a potem zapisuje je wraz z numerem porządkowym do pliku w formacie .txt - i tutaj pojawia się właściwy problem - jako, że potrafię zostawić go na kilka godzin (bądź dni) włączonym bez przerwy, generuje on całkiem spore pliki (rekord = 0,5 GB), których czasem nie da się otworzyć. Problem rozwiązałem częściowo zapisując po milion liczb na plik, lecz to wciąż za mało. Pytanie brzmi: czy jest jakiś sposób (oraz format) zapisu pozwalający na zapis liczb do pliku w ich formie takiej jak są reprezentowane np. w pamięci RAM, a nie po przetworzeniu na tekst? Kod funkcji poniżej: void lpierwz::oiw() { if( tryb == 0 ) { return; } fstream zapis; while( par == 0 && par == 1 ) { cout << "Czy chcesz podac parametry startowe?" << endl; cout << "Tak - 0" << endl; cout << "Nie - 1" << endl; cout << "Twoj wybor: "; cin >> par; } if( par == 0 ) { while( true ) { cout << "Ostatnia liczba porzadkowa: "; cin >> porz; cout << "Ostatnia liczba pierwsza: "; cin >> p; if( p < 2 || ++porz < 1 ) { cout << "Błąd" << endl; continue; } break; } } for( unsigned __int64 i =( porz - 1 ) / 1000000; p != 0; i++ ) { zapis.open( "pierwsze[" + to_string( i + 1 ) + "].txt", ios::in | ios::out | ios::ate | ios::app ); do { pier = static_cast < unsigned __int64 >( pow( p, 0.5 ) + 1 ); while( r > 0 ) { if( pier > x ) { r = p %++x; } else { break; } } if( pier == x ) { cout << porz << ". liczba pierwsza:" << p << endl; zapis << porz++ << "-" << p << endl; check = true; } x = 2; r = ++p % x; } while(( check ?( porz % 1000000 != 1 ) : true ) &&( p != 0 ) ); zapis.close(); check = false; } }
|
|
Bielan |
» 2017-03-08 21:46:33 Zapis binarny? Aczkolwiek rozwiązanie to jest krótko terminowe. Może zapisuj każdą liczbę pierwszą do osobnego pliku, a jako nazwę pliku użyj liczbę porządkową? Pamiętaj też, że bardzo szybko możesz też przekroczyć rozmiar long long. |
|
Kinexity Temat założony przez niniejszego użytkownika |
» 2017-03-08 21:57:44 Dzięki za odpowiedź! Jeżeli chodzi o to co napisałeś o zapisie każdej liczby do innego pliku - to nie jest do końca kwestia rozmiaru (nawet plik .txt o rozmiarze 100 MB jestem w stanie otworzyć), a raczej poziomu ściśnięcia danych oraz prędkości. A jeżeli chodzi o prędkość to wyglądałoby to tak (po myślniku znajduje się średnia ilość liczb pierwszych znalezionych i zapisanych na sekundę): - dla zapisywania normalnego (>10000 liczb na plik) - 900-1000/s - po jednej na plik - 5-10/s Różnice są znaczne... EDIT: Nie wiem czy to do końca widać w kodzie ale program przerwie wykonywanie przy przekroczeniu rozmiaru. |
|
Bielan |
» 2017-03-08 22:01:20 W takim razie zapis binarny. A w momencie gdy plik będzie większy od RAMu to trzeba będzie czytać plik fragmentami.
EDIT: ok, nie zagłębiałem się w kod :) |
|
« 1 » |