Metodo per salvare grosse quantità di file

di il
7 risposte

Metodo per salvare grosse quantità di file

Ho fatto questo programma:
prendo tutti i sottotitoli di una serie tv e in un documento di testo scrivo tutte le parole tipo così:

ciao
come
va
?
ciao
bene
grazie


cioè una parola per riga. Poi di ogni parola voglio contare tutte le volte che viene ripetuta e successivamente elencare tutte le parole dalla più ripetuta e alla meno ripetuta.

Per ora ho fatto così: in una cartella creo un file per ogni parola quando una parola si ripete semplicemente accanto al file incremento di uno, tipo:
2 ciao
1 come
ecc

e poi per vedere qual era la parola più ripetuta semplicemente lo guardavo dalla cartella riordinando i file per nome...
Per ora me la sono cavata così, però adesso voglio prendere una quantità spropositata di sottotitoli e fare lo stesso e una cartella con tantissimi file mi si impalla tutto il pc... e anche il documento di testo con così tante parole credo sia un bordello... vi viene in mente un metodo più pratico?


poi ho anche pensato ad un altro problema. Per esempio in inglse ci sono le parole composte tipo "get out" "get by" coem faccio con quelle...

7 Risposte

  • Re: Metodo per salvare grosse quantità di file

    E' un approccio da @p0ll0 Tanto per giocare con il nick

    Quello che ti serve e' una struttura dati intelligente.
    Questa struttura ESISTE e si chiama Bag:

    e' come un Set, ma oltre a tenere un'unica copia dell'oggetto, tiene traccia anche di QUANTE VOLTE l'oggetto e' stato inserito nel Bag.

    Si implementa con una Map.

    Non sai che cosa e' un Set, una Map, un'interfaccia e che cosa significa implementare un'interfaccia?

    Bene, allora e' il momento di acquistare un libro su Java e E STUDIARE !!!!

  • Re: Metodo per salvare grosse quantità di file

    p0ll0 ha scritto:


    Per ora ho fatto così: in una cartella creo un file per ogni parola quando una parola si ripete semplicemente accanto al file incremento di uno, tipo:
    2 ciao
    1 come
    ecc

    e poi per vedere qual era la parola più ripetuta semplicemente lo guardavo dalla cartella riordinando i file per nome...
    Pessima (e pure "brutta") idea.

    p0ll0 ha scritto:


    vi viene in mente un metodo più pratico?
    Premesso che bisognerebbe vedere quante parole UNICHE stimi che ci possano essere. Ma se si tratta di un numero ragionevole, es. 10000, 20000 o anche 50000, puoi fare tutto tranquillamente in memoria tramite una "mappa" in cui la chiave è la parola (String) e il valore è un "contatore" (Integer).
    Se poi vuoi ottimizzare un po' ed evitare il wrapping/unwrapping (esplicito o implicito con auto-boxing/unboxing) del valore int contenuto nel Integer (che è immutabile), puoi anche fare una tua classe es. Contatore che incapsula un int ma che è mutabile offrendo ad esempio un metodo incrementa() .

    p0ll0 ha scritto:


    poi ho anche pensato ad un altro problema. Per esempio in inglse ci sono le parole composte tipo "get out" "get by" coem faccio con quelle...
    Questo è un altro discorso. Ma devi scegliere tu. Vuoi trattare solo le parole distinte ... o anche le locuzioni, i "verbi frasali", ecc.. o magari entrambe le cose?
    E tieni presente (questo complica un po') che nel caso dei verbi frasali inglesi, la prima parola che è il verbo può essere coniugato nelle varie forme, es. "gets out", "got out", "getting out".
    Quindi cosa intendi fare?
  • Re: Metodo per salvare grosse quantità di file

    Non so cosa siano i map ma credo che mi arrangerò, faccio tutto su un documento di testo. Tipo controllo che la parola esiste già nel documento di testo e se esiste già accanto ci incremento il numero. Spero di essermi spiegata. Le parole sono molto di più di 50 mila magari posso fare più documenti di testo. Mi ci vorranno secoli. Grazie mille dell'aiuto.
  • Re: Metodo per salvare grosse quantità di file

    p0ll0 ha scritto:


    Tipo controllo che la parola esiste già nel documento di testo e se esiste già accanto ci incremento il numero.
    Ma hai idea di quanto sia ALTAMENTE inefficiente una cosa del genere??

    p0ll0 ha scritto:


    Le parole sono molto di più di 50 mila magari posso fare più documenti di testo.
    Io prima parlavo di quante parole uniche, cioè DISTINTE, presumi ci siano. Perché è quello che conta se vuoi usare una struttura dati come una "mappa" (e nel caso specifico parlo di un java.util.HashMap).

    Poi se la "sorgente" delle parole è un normale file di testo che leggi a "righe", spezzandole per ottenere le varie parole, allora non è questo che occupa particolarmente memoria, quindi ne puoi gestire a milioni di parole in ingresso. Non è quello il problema.

    P.S. e se non hai idea di cosa siano le collezioni di Java, l'unica, detto davvero onestamente, è di studiare bene.
  • Re: Metodo per salvare grosse quantità di file

    andbin ha scritto:


    p0ll0 ha scritto:


    Tipo controllo che la parola esiste già nel documento di testo e se esiste già accanto ci incremento il numero.
    Ma hai idea di quanto sia ALTAMENTE inefficiente una cosa del genere??
    perché inefficiente?
  • Re: Metodo per salvare grosse quantità di file

    p0ll0 ha scritto:


    andbin ha scritto:


    p0ll0 ha scritto:


    Tipo controllo che la parola esiste già nel documento di testo e se esiste già accanto ci incremento il numero.
    Ma hai idea di quanto sia ALTAMENTE inefficiente una cosa del genere??
    perché inefficiente?
    Alt, allora innanzitutto precisiamo meglio, perché hai parlato di diverse cose.

    1) Se avessi un singolo file di testo con dentro tutte le parole una per riga, con a fianco (prima o dopo) il contatore, tipo:

    123 ciao
    45 hello
    67 prova
    .....

    e questo file magari contiene 20000 parole, allora andare a modificare il contatore AD OGNI singola parola che ricavi da una sorgente è ALTAMENTE inefficiente. Perché detto in generale, un file del genere va letto e RISCRITTO tutto da zero ad ogni modifica, anche se cambi solo 1 riga (es. invece di 44 hello vuoi scrivere 45 hello).


    2) Se avessi un file per ciascuna parola, dove il file contiene il contatore, tipo:

    file "ciao" (o ciao.txt) contiene 123
    file "hello" contiene 45
    ...

    Incrementare il contatore è discretamente~abbastanza inefficiente. Certamente più efficiente di 1) ma comunque si tratta sempre di aprire, leggere e poi riscrivere il file, sebbene contenga una manciata di byte. E questo AD OGNI incremento.
    E comunque ci possono essere problemi perché il nome del file È la parola e se la parola contiene caratteri particolari o non ASCII, bisogna vedere quale file-system usi perché ci possono essere caratteri che NON puoi usare in un nome di file.


    E nessuna di queste due opzioni è davvero valida, specialmente se il numero delle parole da elaborare è elevatissimo. Insomma, questi due approcci NON "scalano" un bel niente.
  • Re: Metodo per salvare grosse quantità di file

    Per non parlare del fatto che NESSUN filesystem (almeno di quelli CONSUMER) digerisce bene una directory con PIU' di qualche migliaio di file.

    Rischi che con 10.000 o 20.000 file ci vogliano MINUTI per trovare il file!
Devi accedere o registrarti per scrivere nel forum
7 risposte