Pagina 1 di 1

scelta linguaggio per buon accesso al disco

Inviato: mer 29 set 2010, 10:30
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

Re: scelta linguaggio per buon accesso al disco

Inviato: mer 29 set 2010, 13:26
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.).

Re: scelta linguaggio per buon accesso al disco

Inviato: mer 29 set 2010, 13:51
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.

Re: scelta linguaggio per buon accesso al disco

Inviato: mer 29 set 2010, 16:52
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

Re: scelta linguaggio per buon accesso al disco

Inviato: mer 29 set 2010, 17:58
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.

Re: scelta linguaggio per buon accesso al disco

Inviato: mer 29 set 2010, 18:07
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).

Re: scelta linguaggio per buon accesso al disco

Inviato: mer 29 set 2010, 19:28
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

Re: scelta linguaggio per buon accesso al disco

Inviato: mer 29 set 2010, 19:43
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ò...

Re: scelta linguaggio per buon accesso al disco

Inviato: gio 30 set 2010, 1:00
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

Re: scelta linguaggio per buon accesso al disco

Inviato: gio 30 set 2010, 12:10
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

Re: scelta linguaggio per buon accesso al disco

Inviato: gio 30 set 2010, 12:37
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...

Re: scelta linguaggio per buon accesso al disco

Inviato: gio 30 set 2010, 17:25
da ZeroUno
ottimo...
funziona tranquillamente su ntfs

Re: scelta linguaggio per buon accesso al disco

Inviato: gio 30 set 2010, 17:30
da 414N
ZeroUno ha scritto:ottimo...
funziona tranquillamente su ntfs
Beh, bene :)

Re: scelta linguaggio per buon accesso al disco

Inviato: gio 30 set 2010, 22:13
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

Re: scelta linguaggio per buon accesso al disco

Inviato: gio 30 set 2010, 22:19
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 :)