scelta linguaggio per buon accesso al disco

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

scelta linguaggio per buon accesso al disco

Messaggio da ZeroUno »

Devo scrivere un programma e sto ancora decidendo che linguaggio utilizzare.

Solitamente uso bash per quasi tutto; altre volte php. Questa volta ancora non lo so.

Il programma non necessita di grosse difficoltà elaborative. Il suo collo di bottiglia sarà plausibilmente il numero di accessi al disco.
Il programma dovrà, al primo lancio, indicizzare una struttura di directory, il cui contenuto può anche essere di migliaia di file.
Ai lanci successivi il programma dovrà essere in grado di dirmi nel minor tempo possibile se:
1) sono stati aggiunti file
2) sono stati eliminati file
3) sono stati spostati file
4) sono stati modificati file
5) varie
Il programma potrà fare affidamento in parte sulla data di modifica perchè devo contemplare anche il fatto che
a) la data viene modificata nonostante non venga modificato il file
b) il file venga modificato nonostante il file rimanga non modificato

la cache dovrà quindi contenere anche gli md5 dei file.

tutto questo suppongo che necessiti una lettura ottimizzata dell'I/O e una cache dei file ben strutturata




Ancora non so bene la struttura dati che utilizzerò; questo dipende dal linguaggio che sceglierò. Potrebbe trattarsi di un semplice file di testo o di un database mysql.

Per il linguaggio, non so tutti quanti i migliori strumenti che mi mettono a disposizione.
- bash (che è quello che uso di più) mi fornisce una buona serie di strumenti prefatti quali ls, find, sort, uniq, grep e compagnia bella. Di contro le strutture dati che offre non possono definirsi tra le più evolute, e l'accesso a mysql non è tra le cose più semplici da gestire (in caso la query ritorni più di un record)
- php (che anche uso parecchio e che può essere usato non solo per il web), offre strutturalità di programmazione e di dati buone e un buon accesso al db; di contro non gli trovo un adeguato supporto per il filesystem
- python non lo conosco abbastanza e sinceramente nemmeno mi piace
- java pure non mi piace nonostante sarebbe il caso di cominciare ad impararlo
- C non so che tipo di strumenti mette a disposizione; non lo conosco a sufficienza (ma a quello si ovvia) ma vorrei evitare in generale linguaggi binari; preferisco di gran lunga quelli che non richiedono un compilatore e soprattutto sono noarch.
- awk sarebbe un buon integratore a bash (ho visto che slackpkg ne fa un buon uso)
- perl non lo conosco abbastanza ma sarebbe una buona occasione per cominciare ad impararlo (una grossa lacuna per un sistemista), però non so quanti strumenti mi mette a disposizione.


Voi cosa mi consigliereste?

Ciao
01
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da 414N »

E se usassi un sistema VCS, tipo svn, git ecc?
Hanno già le caratteristiche che richiedi (log modifiche, md5/checksum dei file ecc.).

Avatar utente
kreen
Linux 2.x
Linux 2.x
Messaggi: 228
Iscritto il: mer 1 feb 2006, 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

Re: scelta linguaggio per buon accesso al disco

Messaggio da kreen »

Hai mai pensato al TCL?
E' interpretato, multipiattaforma, ha un ottimo supporto per array e liste. Inoltre, non so se ti può interessare puoi scrivere delle funzioni in C e "fonderle" con la shell tcl, richiamandole come normali comandi e sfruttando il tcl per passare parametri etc...
Detto in due righe magari non hai capito un tubo, ma ti assicuro che vale la pena dare un'occhiata. Forse può risolverti una marea di problemi e capiti due/tre concetti caratterizzanti, sono convinto che andrai via liscio.

Ciao.

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da masalapianta »

visto che chiedi che il tutto venga fatto nel minor tempo possibile, la miglior scelta è il C; riguardo all'implementazione ci son due strade:
1) un demone che usi inotify per tenere d'occhio la porzione di fs interessata e annoti tutte le modifiche in un log (in C l'implementazione è banale); i vantaggi sono la velocità (hai le modifiche in tempo reale), lo svantaggio è dover tenere in piedi un demone (il che, salvo in situazioni particolari, non è un problema). Se non conosci il C, puoi implementare tutto in shell scripting, utilizzando inotifywait (o anche perl, python o ruby visto che ci sono i bindings per tutti e tre)
2) approccio non in tempo reale: la soluzione meno peggio che mi viene in mente è indicizzare i file utilizzando un hash table (le chiavi sono i filename con il path assoluto e il valore saranno gli hash del file e dei suoi metadati), dopodichè quando devi controllare se ci son state modifiche, pigli file per file, ti ricavi gli hash e li confronti con quelli presenti nell'hash table

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da ZeroUno »

E se usassi un sistema VCS, tipo svn, git ecc?
Hanno già le caratteristiche che richiedi (log modifiche, md5/checksum dei file ecc.).
Adoro git, ma
1) non è pensabile di utilizzarlo su un repository di 30GB con 20000 file binari (ci ho provato una volta con 5G mischiati binari e testuali, e le performance di un git status erano pessime)
2) non ho bisogno di un versioning, non ho necessità di fare rollback di modifiche o cancellazioni di file, ma solo monitoraggio di spostamento file


@masalapianta: l'approccio che preferisco è quello non in tempo reale.


sto facendo qualche test di performance.
filesystem ntfs
n. file: 20000
max depht: 3
dimensione totale: 31G
n. file testuali: 0
creazione lista estensiva dell'elenco dei file 8 secondi:

Codice: Seleziona tutto

  find -type f -printf "$FORMAT\n"
in cui $FORMAT è l'elenco di _tutti_ i parametri accettati da find -printf (che potete vedere dal man find)
creazione elenco md5 18 minuti:

Codice: Seleziona tutto

 time find -type f -printf "$FORMAT" -exec md5sum {} \;
real    18m36.085s
user    3m22.355s
sys     3m12.511s
dimensione lista: 16M la prima e 18M la seconda; sono salvate in due file.
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da 414N »

ZeroUno ha scritto:
E se usassi un sistema VCS, tipo svn, git ecc?
Hanno già le caratteristiche che richiedi (log modifiche, md5/checksum dei file ecc.).
Adoro git, ma
1) non è pensabile di utilizzarlo su un repository di 30GB con 20000 file binari (ci ho provato una volta con 5G mischiati binari e testuali, e le performance di un git status erano pessime)
2) non ho bisogno di un versioning, non ho necessità di fare rollback di modifiche o cancellazioni di file, ma solo monitoraggio di spostamento file
come non detto :)
ZeroUno ha scritto: creazione elenco md5 18 minuti:

Codice: Seleziona tutto

 time find -type f -printf "$FORMAT" -exec md5sum {} \;
real    18m36.085s
user    3m22.355s
sys     3m12.511s
Dovresti usare l'opzione -b di md5sum per file binari (non testuali).

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da ZeroUno »

414N ha scritto:Dovresti usare l'opzione -b di md5sum per file binari (non testuali).
che differenza c'è?

con -b ci sta mettendo metà del tempo.

non ha finito ma ha fatto 10000 in 5 minuti
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da 414N »

ZeroUno ha scritto:
414N ha scritto:Dovresti usare l'opzione -b di md5sum per file binari (non testuali).
che differenza c'è?

con -b ci sta mettendo metà del tempo.

non ha finito ma ha fatto 10000 in 5 minuti
Calcola il MD5 in modalità binaria, non testuale (che è il default). Almeno, così è scritto nella man page.
Su internet ho trovato qualche dettaglio in più:

Codice: Seleziona tutto

‘-b’
‘--binary’
    Treat each input file as binary, by reading it in binary mode and outputting a ‘*’ flag. This is the inverse of --text. On systems like GNU that do not distinguish between binary and text files, this option merely flags each input file as binary: the MD5 checksum is unaffected. This option is the default on systems like MS-DOS that distinguish between binary and text files, except for reading standard input when standard input is a terminal.
Come calcoli sottostanti non so cosa cambi, però...

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da ZeroUno »

errata corrige: mi ci ha messo 17 minuti.

EDIT:
ho provato con sum anzichè md5sum e il tempo scende a 10 minuti.
l'output non è univoco come md5 (che poi nella teoria non lo è nemmeno quello) ma per il tipo di utilizzo è sufficiente
più ottimizzato di quello non credo che esista

Codice: Seleziona tutto

      for (i = 0; i < bytes_read; i++)
        s += buf[i];
quello che rimane è solo accesso al disco per:
1) caricare il programma 'sum' in ram
2) leggere il file da analizzare
l'impatto del punto 1 non è trascurabile. Se infatti do
sum $(find -type f)
i tempi scendono a 6 minuti
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da masalapianta »

Codice: Seleziona tutto

nohup inotifywait -r -m -e modify -e delete -e create -e move --format '<%e> %w%f ' $DIR > /var/log/inotify.log 2>/dev/null &
poi fai come preferisci

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da 414N »

masalapianta ha scritto:

Codice: Seleziona tutto

nohup inotifywait -r -m -e modify -e delete -e create -e move --format '<%e> %w%f ' $DIR > /var/log/inotify.log 2>/dev/null &
poi fai come preferisci
Se usa NTFS o FAT come filesystem non credo possa usare inotifywait...

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da ZeroUno »

ottimo...
funziona tranquillamente su ntfs
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da 414N »

ZeroUno ha scritto:ottimo...
funziona tranquillamente su ntfs
Beh, bene :)

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da masalapianta »

414N ha scritto: Se usa NTFS o FAT come filesystem non credo possa usare inotifywait...
perchè? inotify ha i suoi hook nel vfs, mica nei singoli fs (anche perchè non avrebbe senso, uno dei motivi per cui esiste il vfs è proprio centralizzare le funzionalità comuni a tutti i fs); quindi se i due fs che hai menzionato passano per il vfs, non ci son problemi ad usare inotify

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: scelta linguaggio per buon accesso al disco

Messaggio da 414N »

masalapianta ha scritto:
414N ha scritto: Se usa NTFS o FAT come filesystem non credo possa usare inotifywait...
perchè? inotify ha i suoi hook nel vfs, mica nei singoli fs (anche perchè non avrebbe senso, uno dei motivi per cui esiste il vfs è proprio centralizzare le funzionalità comuni a tutti i fs); quindi se i due fs che hai menzionato passano per il vfs, non ci son problemi ad usare inotify
Non l'ho mai usato e la 'i' iniziale m'ha tratto in inganno facendomi pensare agli inode, piuttosto che al vfs.
Si impara sempre qualcosa :)

Rispondi