Verifica rapida e ottimizzata per la memoria per i valori nel database utilizzando php

2

Ho una funzione per generare n stringa casuale con la stessa lunghezza, assicurandomi che non ci siano duplicati, e poi li salviamo nel database. In questo momento, per accelerare le cose, prima ottengo tutta la stringa salvata dal database, le converto in un dizionario, e poi le controllo per duplicare ogni volta che genera una stringa casuale piuttosto che controllare ogni volta dal database.

Questo è il mio codice:

// get all codes first
$savedCodes = $this->Product_model->getAllCodes();
$dictionary = array();
for ($i = 0; $i < count($savedCodes); $i++)
    $dictionary[$savedCodes[$i]['code']] = 1;

$input_code = intval($this->input->post('qty'));
$query = "insert into products (code, trialCount, date_created, status) values";
for ($i = 0; $i < $input_code; $i++)
{
    do
    {
        $data['code'] = substr(str_shuffle($chars), 0, 3) . substr(str_shuffle($numbers), 0, 15);
        $exist = isset($dictionary[$data['code']]);
        // $exist = $this->Product_model->get(array('code' => $data['code']));
    }
    while ($exist == true);

    if ($i > 0)
    {
        if ($i % 900 == 0)
        {
            $query .= ';';
            $this->Product_model->insertBulk($query);
            $query = 'insert into products (code, trialCount, date_created, status) values';
        }
        else
            $query .= ',';
    }
    $query .= " ('" . $data['code'] . "', 0, " . $data['date_created'] . ", 'active')";

    $dictionary[$data['code']] = 1;
    $success = $success+1;
}

$this->Product_model->insertBulk($query);

Notare che uso isset per il controllo per accelerare le cose.

Ora, il problema è che con l'aumentare della dimensione della tabella aumentano anche le dimensioni di $dictionary e $savedCodes . Quindi, trovo messaggi come Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 14 bytes) sulla riga $dictionary[$savedCodes[$i]['code']] = 1;

Esiste comunque una soluzione? Non voglio usare $exist = $this->Product_model->get(array('code' => $data['code'])); perché renderà la funzione molto molto lenta.

EDIT: Uso il servizio di hosting pubblico, quindi non posso aumentare il valore php max_memory

    
posta Oscar Yuandinata 09.11.2016 - 15:55
fonte

1 risposta

1

Quello che potresti fare è creare una nuova tabella UnusedCode con i campi UnusedCodeId e code e popolarla con tutte le stringhe casuali (o non) che vuoi - fallo usando un altro programma.

Nella tua app di produzione, seleziona il primo record da UnusedCode , usa il codice ed elimina il record dalla tabella.

    
risposta data 09.11.2016 - 17:53
fonte

Leggi altre domande sui tag