Avete un elenco di cosa viene eliminato quando si verifica l'eliminazione (o si modifica qualsiasi processo di eliminazione per creare questo)?Se così fosse, non potresti avere un elenco di "Sono stato cancellato" con un timestamp, e quindi raccogliere gli elementi da questo elenco per sincronizzare solo ciò che è cambiato? Naturalmente, si vorrebbe comunque avere un qualche tipo di lavoro batch da sincronizzare durante un tempo lento sul server, ma penso che potrebbe ridurre il carico.
Un'altra opzione può essere, a seconda di cosa sta cambiando il codice, per fare in modo che quel processo aggiorni i database (se si hanno più nodi) direttamente quando si elimina. Ciò introdurrebbe qualche accoppiamento nei sistemi, ma sarebbe il modo più efficiente per farlo.
I modi migliori a mio avviso sono alcune variazioni sull'idea di messaggistica che si è verificata un'eliminazione (anche se si tratta solo di un file che si scrive in alcuni dove con un elenco di file eliminati di recente) o di qualche tipo di diretta meccanismo di callback, tramite il codice o semplicemente regolando l'archivio di dati persistente che l'applicazione utilizza direttamente dal processo di cancellazione.
Anche con tutto ciò detto, è sempre necessario avere un qualche tipo di sincronizzazione dell'indice o controllo periodico di integrità sugli indici per essere sicuri che tutto sia abbinato correttamente.
Si potrebbe (e sarei scioccato se non dovessi basare sul numero di file che hai) partizionare lo spazio file in cartelle con, ad esempio, 5.000-10.000 file per cartella, quindi creare un semplice file che ha un hash dei nomi di tutti i file nella cartella. Questo potrebbe catturare le eliminazioni, ma continuo a pensare che una richiamata diretta di qualche forma quando si verifica l'eliminazione sia un'idea molto migliore. Se hai una cartella monolitica con tutte queste cose, creare qualcosa per suddividerla in cartelle separate (abbiamo usato un numero semplice sotto la cartella principale in modo da poter andare avanti fino alla nausea) dovrebbe velocizzare tutto molto; anche se si deve fare questo per tutti i nuovi file e lasciare i vecchi file sul posto così com'è, almeno si potrebbe fermare il sanguinamento sul recupero dei file.
A mio parere, poiché si controlla a livello di codice un indice dei file, è necessario che lo stesso programma sia coinvolto in qualche modo (o notificato) quando si verificano cambiamenti al momento della modifica al file system sottostante, anziché consentire cambiamenti per accadere e quindi guardare attraverso tutto per gli aggiornamenti. Naturalmente, per catturare i valori anomali in cui questa comunicazione si interrompe, è necessario disporre anche del codice di sincronizzazione per verificare effettivamente ciò che si trova nel file system e aggiornare periodicamente l'indice (anche se questo potrebbe e probabilmente dovrebbe essere messo in batch fuori processo dall'applicazione principale)).
fonte
2012-07-05 11:21:21
Elimina come in: eliminazione basata sul sistema su cui non si ha il controllo? o Un'eliminazione che è attivata da qualche applicazione in cui potresti fare qualcosa? – Krrose27
Perché il processo di scansione utilizza molta memoria? In pratica stai semplicemente elencando i file in una directory alla volta, giusto? – Joni
Sì, tuttavia, non riesco a controllare quanti file sono presenti nella directory. Una directory può contenere 1 miliardo di file. Inoltre, se inserisco un dato durante la scansione immediata di un file, esso risparmia molta memoria ma richiede molto tempo perché i problemi di I/O. Se uso l'inserto di massa, è più efficiente. – s011208