* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Maggio 03, 2024, 05:50:02 am

Inserisci il nome utente, la password e la durata della sessione.

534 Visitatori, 0 Utenti

Autore Topic: Ottimizzare un programma che lavora suo files della rete aziendale  (Letto 905 volte)

bonmario

  • Hero Member
  • *****
  • Post: 1302
  • Karma: +10/-1
Ciao a tutti,
faccio una breve premessa ...
Fino ad un paio di mesi fa, al lavoro avevamo un desktop fisso. Quando lavoravo da casa, mi collegavo in RDP a quel PC.
Ora, abbiamo invece un portatile, ed il fisso è stato eliminato.
Quando lavoro da casa, tramite la mia fibra, mi collego alla rete aziendale. La mia "fibra" ha però prestazioni da ADSL: 20 mega in download ed 1 in upload ... quando tutto va bene ...

Ma veniamo ora al problema. Un mio programma, fatto in Lazarus, fa un elenco di files presenti su uno dei nostri dischi di rete, lo filtra, e poi emette in una tabella l'elenco dei files filtrati, mostrando tra le altre cose il proprietario di quel file. Quando avevo ancora il PC fisso, e quando sono fisicamente in sede, fila tutto liscio, ma quando lavoro da casa, il programma dura una vita. Praticamente, per esporre i dati di 135 files, al lavoro ci mette circa 15 secondi, quando lavoro da casa un paio di minuti.
Agendo in debug da casa, ho verificato che la fase che rallentano il tutto sono 2:
- la ricerca iniziale dei files (che ho già ottimizzato, e da casa ci impiega una quindicina di secondi)
- il reperimento del proprietario del file, che occupa la restante parte del tempo

Io credo che la mia fibra faccia da "collo di bottiglia", avevo quindi pensato di fare così:
- emettere subito la tabella con tutti i dati, tranne il proprietario
- lanciare il reperimento del proprietario di ogni file tramite un thread separato
- in alternativa, lanciare il reperimento di tutti i proprietari tramite un unico thread
- mano a mano che determino il proprietario di un file, integrare il dato nella tabella dei risultati

Secondo voi può avere senso come soluzione, o alla fine farei del lavoro per niente, visto che la causa del problema è comunque la mia linea penosa?

Grazie, Mario

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1268
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Ottimizzare un programma che lavora suo files della rete aziendale
« Risposta #1 il: Febbraio 06, 2022, 09:31:39 am »
Ti aggiorno a step, per problemi di tempo.

Prima cosa: la rete internet fà sempre e comunque da collo di bottiglia, perchè prevede filtri e quant'altro per una connessione ad una rete aziendale (che avviene normalmente tramite VPN).

Lavorare in VPN è generalmente più lento e le latenze si sommano (anche se di poco), inoltre il collo di bottglia (oltre a quanto già detto e alla tua "fibra") è la capacità di banda in ingresso e usicta (upload / download) della tua azienda e di come vengono bilanciati i carichi.

Quando lavorai per una multinazionale, avevo un collegamento 1 Mbit / 640 Kbit da casa mia e comunque mi sembrava una favola  ;D

Poi, per lavorare in rete, sopratutto da remoto, è necessario usare delle accortezze:

1) Evitare di fare accessi ricorsivi alla rete stessa: chiamare ricorsivamente funzioni che ad esempio eseguano ricerche di file in rete non è la pratica giusta. La cache, proprio in caso di vpn, non è efficiente anzi tutt'altro.

2) Sfruttare al massimo le funzioni del sistema operativo (lo sò, pregiudica molto spesso la compatibilità e il porting  :-\ ), quindi usare le funzioni specifiche (API) per l'accesso alle risorse di rete e usare dei metodi propri per eseguire meno accessi possibile.
 
3) Fatti una cache personale (assolutamente criptata) dei SID degli account: per accedere al proprietario di un file prima si deve rilevare il SID a cui appartiene in file, successivamente si deve rilevare (revers lookup) il "nome" del SID. Queste api non vengono eseguite in cache, per problemi di sicurezza.
Il SID non cambia per tutta l'esistenza di un account. Quindi se ti fai una tua cache, risparmi un bel pò di tempo (ogni tanto magari l'aggiorni).
N.B.: mi è venuto un dubbio sul fatto che creare la cache dei SID sia lecito o meno  :o 

4) Lavorare con i thread và benissimo (in ne uso a decine) ma devi ovviamente organizzare bene "le cose". Usare i timer di debug (TStopWatch) per debugare i tempi per confrontare le varie soluzioni è sempre una scelta ottima.

Spero di esserti stato d'aiuto, se mi vengono in mente altre cose ti aggiorno.

Ti allego una unità DIAGNOSTICS che avevo adattato e che ti  consente di usare i timer ad alta risoluzione in maniera semplicissima.

Basta che la includi nelle unit dove la usi. Non c'è da inizializzare niente. Puoi istanziare quanti timer vuoi (ovvio che occupano risorse).

Uso:

Codice: [Seleziona]
var TimDebug: TStopWatch;

TimeDebug.StartNew;
........
........  TUO CODICE SU CUI VALUTARE IL TEMPO
........
TimeDebug.Stop;

ShowMessage(TimeDebug.ElapsedMilliseconds.ToString);


Ciao
« Ultima modifica: Febbraio 06, 2022, 09:45:20 am da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2872
  • Karma: +20/-4
Re:Ottimizzare un programma che lavora suo files della rete aziendale
« Risposta #2 il: Febbraio 06, 2022, 11:34:49 am »
ciao bonmario

tanto per aggirare il problema, ti volevo chiedere se ci fosse la possibilità di far girare questo tuo programma in lan
se i dati sono abbastanza statici questa operazione la potresti schedulare su un pc in lan che ti tiene aggiornata la tabella
poi quando sei in VPN ti leggi direttamente la tabella
questo tanto per buttarla lì e capire la situazione  :)


tralasciando il workaround sopra vorrei farti un po' di domande:
  • come rilevi i file (comando dir rediretto, findfirst/findnext o FindAllFiles)?
  • come determini il proprietario?
  • il percorso di rete (da cui devi estrarre l'elenco dei file) deve essere risolto da dns server o usi esplicitamente l'IP?

il discorso del DNS è importante quando si è in vpn: il tempo perso potrebbe essere tutto qua


io penso che più che la tua fibra (che poi... che ping hai?) il problema possa risiedere tra il DNS e l'utilizzo delle api particolari dei permessi del protocollo SMB usato sopra la VPN
ad esempio potresti copiare un file di 100MB attraverso la vpn (non copia/incolla via RDP ma da esplora risorse) e vedere quanto tempo ci vuole, già questo ci fa capire se i tempi sono da collo di bottiglia


nomorelogic


Edit:
il test della copia del file da 100MB forse è meglio farlo da command line: se lo fai con copia/incolla da esplora risorse i tempi sono inquinati dall'analisi iniziale dei tempi prima e dai calcoli statistici durante
« Ultima modifica: Febbraio 06, 2022, 11:50:21 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

bonmario

  • Hero Member
  • *****
  • Post: 1302
  • Karma: +10/-1
Re:Ottimizzare un programma che lavora suo files della rete aziendale
« Risposta #3 il: Febbraio 06, 2022, 07:46:01 pm »
Grazie @DragoRosso, mi hai dato un'ottima idea. Tenendo conto poi che quei files hanno al massimo 5 proprietari, potrei farmi un elenco direttamente a runtime: la prima volta verifico il proprietario "veramente", e mi salvo l'esito, dalla seconda volta in poi, cerco direttamente nei risultati.
Se riesco, domani faccio la modifica e martedì, lavorando da casa, la testo !!!

Per @nomorelogic:
- la ricerca la faccio con una classe creata da me, ereditata da "TFileSearcher". In questo caso specifico, il codice aggiunto da me non entra però in gioco
- il proprietario lo determino grazie a del codice che avevo trovato tempo fa in rete. In pratica, prima determina il nome del server (in questo caso, anche se i files sono parecchi,essendo tutti sullo stesso server, lo fa una volta sola). Fatto quello, determina i dati dell'utente proprietario del file, e del gruppo di appartenenza di quell'utente. Se serve, posso postare il codice, anche se le 2 istruzioni che rallentano il tutto, le ho già individuate, e se non ricordo male, fanno una chiamata diretta ad un'API di Windows,

Do la colpa alla fibra, o comunque al fatto che lavoro da casa, essenzialmente per 2 motivi: i 2 colleghi che lavorano con me a questo progetto, che abitano praticamente in centro, non hanno questo problema, o altri problemi che mi ritrovo io, e che hanno tutti a che fare con il lavoro su files in rete. L'altro motivo, è che una mattina la fibra non andava, e mi sono divuto collegare usando lo smartphone come hotspot: quella mattina, filava tutto liscio. Non dico come se fossi in sede, ma comunque quasi.

P.S. Ho fatto uno speedtest adesso, ed il ping era di 28 ms

Ciao, Mario

bonmario

  • Hero Member
  • *****
  • Post: 1302
  • Karma: +10/-1
Re:Ottimizzare un programma che lavora suo files della rete aziendale
« Risposta #4 il: Febbraio 09, 2022, 12:17:25 pm »
Ciao,
visto che comunque da inizio marzo dovrei tornare a lavorare fisso dalla sede, alla fine ho scelto una strada semplice e veloce, che volendo potrei disattivare in poco tempo il mese prossimo.
In pratica, quando ho finito di emettere la tabella, salvo in un file, per ogni riga
- Nome del file
- Data/ora di ultima modifica
- Proprietario

All'inizio della ricerca, porto questo file in memoria
Quando devo andare a cercare il proprietario di un file, prima lo cerco in quest'area, considerando nome file e Data/Ora come chiave. Se lo trovo, ho già ciò che mi serve, se non lo trovo, cerco l'informazione su disco

Grazie ancora per l'aiuto !!!

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18793
  • Topic in totale: 2237
  • Online Today: 530
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 534
Total: 534

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.