Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zapis do pliku [problem rozmiaru w pamięci]

Ostatnio zmodyfikowano 2017-03-08 22:01
Autor Wiadomość
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:
C/C++
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;
    }
}
P-158716
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.
P-158721
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.
P-158724
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 :)
P-158726
« 1 »
  Strona 1 z 1