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