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

fabio_1

Utente Attivo
231
8
CPU
i5-6500
Scheda Madre
ASRock H170 Pro4S
HDD
Samsung 870QVO 1TB, Samsung 850EVO 250GB, HD Toshiba 2TB
RAM
Corsair DD4 2133 C13 2x4GB
GPU
Sapphire R9 380 4GB NITRO
Audio
Integrata + DAC Audioengine D1
Monitor
LG 24MB56HQ-B IPS
PSU
XFX 550 Black
Case
Corsair Spec-03
Periferiche
Casse Edifier R1800TIII
OS
Windows 10
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
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 
  • Mi piace
Reazioni: fabio_1

fabio_1

Utente Attivo
231
8
CPU
i5-6500
Scheda Madre
ASRock H170 Pro4S
HDD
Samsung 870QVO 1TB, Samsung 850EVO 250GB, HD Toshiba 2TB
RAM
Corsair DD4 2133 C13 2x4GB
GPU
Sapphire R9 380 4GB NITRO
Audio
Integrata + DAC Audioengine D1
Monitor
LG 24MB56HQ-B IPS
PSU
XFX 550 Black
Case
Corsair Spec-03
Periferiche
Casse Edifier R1800TIII
OS
Windows 10
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
 

Andretti60

Utente Èlite
6,440
5,091
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.
 

fabio_1

Utente Attivo
231
8
CPU
i5-6500
Scheda Madre
ASRock H170 Pro4S
HDD
Samsung 870QVO 1TB, Samsung 850EVO 250GB, HD Toshiba 2TB
RAM
Corsair DD4 2133 C13 2x4GB
GPU
Sapphire R9 380 4GB NITRO
Audio
Integrata + DAC Audioengine D1
Monitor
LG 24MB56HQ-B IPS
PSU
XFX 550 Black
Case
Corsair Spec-03
Periferiche
Casse Edifier R1800TIII
OS
Windows 10
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:

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili