DOMANDA Elenco su file di testo o come oggetti di database?

Pubblicità

fabio_1

Utente Attivo
Messaggi
244
Reazioni
8
Punteggio
43
Ciao a tutti.

Sto programmando un'applicazione web per gestire un generatore di nomi (lo so che ce ne sono tanti ma mi servono delle funzioni a modo mio.
Sto usando Python (con Django) ma sono tutt'altro che esperto quindi mi serve un consiglio per impostare il tutto.
Attualmente ho i nomi su un file di testo e l'idea iniziale era accedervi tramite il comando open(), leggerli, fare quello che devo fare e richiudere il file con close().

Mi è venuto però in mente che forse è meglio, più veloce e certo più comodo averli come oggetti e quindi nel database. Ho creato un modello (con campi nome, genere, linguaggio, giusto per capirsi) e non mi resta che creare gli oggetti.

A occhio direi che dovrebbe essere un netto miglioramento rispetto accedere al file (parlo di prestazioni, ma anche di aggiungere, controllare che non siano doppioni, filtrare, ordinare, etc) però mi è sorto un dubbio. Io sto usando uno script per popolare il database del mio progetto web (che si compone di molte applicazioni, il generatore di nomi è solo una di esse). Al momento sono ancora in fase di sviluppo e periodicamente cancello il database e lo ripopolo da zero. Per la precisione sono ancora agli inizi e già il mio script crea tipo 8000 oggetti di vari modelli in circa un minuto, da qui alla fine prevedo di quintuplicare tale numero o anche di più. I nomi sono 13000 e destinati ad aumentare quindi andrei a raddoppiare/triplicare gli oggetti da creare in un botto solo. Il tempo necessario a popolare il database non mi preoccupa troppo perchè è un'operazione periodica ma rara (diciamo una volta a settimana) e una volta operativo penso (e spero) non sarà fatta quasi mai quindi anche fosse un'ora o due pazienza. Però lo script allungandosi a dismisura temo diventerà sempre più difficile da gestire (senza usare la funzione cerca non troverò più nulla, ad esempio). Diciamo che queste considerazioni mi insospettiscono: sto forse terribilmente sbagliando qualcosa? non avendo esperienza non so come comportarmi, grazie per l'aiuto
 
Se devi gestire 13000 records credo che l'uso di un file di testo su cui lavorare sequenzialmente sia deprecabile. Quindi ti conviene decisamente organizzarli come tabella di un db.. direi MySQL.

Per il resto non riesco a capire la problematica che esponi, sinceramente anche perché non utilizzi una terminologia appropriata e non hai chiarito il tipo di problema informatico che devi risolvere: i tempi di cui parli mi sembrano eccessivi.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
Se devi gestire 13000 records credo che l'uso di un file di testo su cui lavorare sequenzialmente sia deprecabile. Quindi ti conviene decisamente organizzarli come tabella di un db.. direi MySQL.
perfetto, ciò che volevo sapere

Per il resto non riesco a capire la problematica che esponi, sinceramente anche perché non utilizzi una terminologia appropriata e non hai chiarito il tipo di problema informatico che devi risolvere: i tempi di cui parli mi sembrano eccessivi.
semplicemente la mia inesperienza unita alla mia paranoia: vedo crescere il file di script e divenire sempre più ingestibile quindi mi preoccupo di star facendo le cose male. Ho misurato il tempo necessario per popolare il mio DB: sui 12 secondi. La stima del minuto era eccessiva, ma quando si aspetta il tempo non passa mai :D
 
Che database stai usando?
Devi pubblicare il codice che usi per popolarlo, altrimenti non ti possiamo dire.
Tieni conto che i database sono ottimizzati per accesso veloce, ma lo devi fare con una transaction unica, se scrivi un record per time è lentissimo.
 
Sto usando postgreSQL perchè ho visto era consigliato con python.

Con transaction unica intendi una sola chiamata (query?) per tutti i nomi che voglio e non una per nome, giusto? vedrò di fare così

Ecco il codice che uso per popolare il DB. Per richiamarli ancora devo lavorarci e non ho codice pronto.
Codice:
def populate():

    #...
    #...

    #potrei aggiunger il gender bisex così i nomi sia maschili che femminili non sarebbero ripetuti due volte
    maschio_gender = add_gender('Male', 'Maschio')
    femmina_gender = add_gender('Female', 'Femmina')

    romano_language = add_name_language('Romano')
    greco_language = add_name_language('Greco')

    #per ora pensavo di metterli così con una riga per nome ma forse è meglio usare una lista e un ciclo for
    romolus_m_romana = add_name('Romolus', maschio_gender, romano_language)
    #...
    vitiani_romana = add_surname('Vitiani', romano_language, 0)
    #...

def add_gender(name_en, name_it):
    g = affiliation.Gender.objects.get_or_create(name_en=name_en, name_it=name_it)[0]
    g.save()
    return g


def add_name_language(name):
    n = affiliation.NameLanguage.objects.get_or_create(name=name)[0]
    n.save()
    return n


def add_name(name, gender, linguaggio):
    n = affiliation.Name.objects.get_or_create(name=name, gender=gender,
        linguaggio=linguaggio)[0]
    n.save()
    return n


def add_surname(name, linguaggio, usato=0):
    s = affiliation.Surname.objects.get_or_create(name=name, linguaggio=linguaggio)[0]
    s.usato=usato
    s.save()
    return s

#...

if __name__ == '__main__':
    print ('Starting initializzation script...')
    print('I dati presenti saranno alterati, sei sicuro di voler continuare?')
    a = input('s/n: ')
    if a in 'ys':
        populate()
    else:
        pass

models.affiliation.py:

Codice:
class Gender(models.Model):
    name = MultilingualCharField(_('sesso'), max_length=64, unique=True)

    def __str__(self):
        return self.name


class NameLanguage(models.Model):
    name = models.CharField(_('nome'), max_length=32)

    def __str__(self):
        return self.name


class Name(models.Model):
    name = models.CharField(max_length=64)
    gender = models.ForeignKey(Gender, on_delete=models.PROTECT)
    linguaggio = models.ForeignKey(NameLanguage, on_delete=models.PROTECT, related_name='Name_language')

    class Meta:
        ordering = ['name', 'gender', 'linguaggio']
        unique_together = ('name', 'gender', 'linguaggio')

    def __str__(self):
        return self.name


class Surname(models.Model):
    name = models.CharField(max_length=64)
    linguaggio = models.ForeignKey(NameLanguage, on_delete=models.PROTECT)
    usato = models.PositiveSmallIntegerField(default=0)

    class Meta:
        unique_together = ('name', 'linguaggio')

    def __str__(self):
        return self.name
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top