2017-06-30 3 views
0

Avant de commencer à me marquer en double, je travaille sous des contraintes très spécifiques: mes deux fichiers de données ne sont pas sur le même système (le fichier complet est distant) et le but final est de transférer les données minimales coûteux!). La machine distante prend en charge rsync et exécute un serveur ftp.Comment puis-je mettre à jour un fichier de données incomplet à partir d'un fichier complet distant en ne transférant que les données manquantes?

Un récepteur GPS enregistre les données de position en temps réel (disons 1Hz). En enregistrant, il transfère les données en temps réel vers un fichier journal, realtime.log. Cependant, parfois le système se bloque et certaines données ne sont pas transférées dans le fichier journal en temps réel. À la fin de chaque heure, le récepteur crée un nouveau fichier journal, hourly.log, et transfère ce fichier complet. Le problème est qu'une grande partie des données de hourly.log est redondante et que les octets coûtent de l'argent à transférer. J'ai besoin d'un moyen de comparer le fichier journal horaire distant (avec des données complètes) au fichier journal local en temps réel et de transférer uniquement les données manquantes. Supposons que si les données sont dans realtime.log, elles sont toujours également dans hourly.log.

Supposons par exemple que realtime.log contient:

2 
3 
5 

et hourly.log contient

1 
2 
3 
4 
5 
6 

Je veux mettre à jour realtime.log équivalent à hourly.logsans transférer les données pour les points 2, 3 et 5. Est-ce possible?

EDIT: Il semble que je suis vraiment un moyen de forcer rsync à comparer deux fichiers ligne par ligne (sorte comme si chaque ligne était son propre fichier) et transférer uniquement les lignes qui sont nouveaux ou modifié.

+0

L'ordre des données est-il important? Ce qui signifie que le realtime.log peut être '2 3 5 1 4 6' après la mise à jour? –

+0

Etes-vous capable d'avoir un script ou une fonction sur l'ordinateur distant qui prend les en-têtes de ligne de realtime.log et analyse les informations que vous voulez, vous pouvez avoir ce script/fonction créer un fichier différent qui est renvoyé? De cette façon, le filtrage de 2, 3 et 5 se produit sur la machine distante plutôt que sur le réseau. –

+0

@PriyanshAgrawal l'ordre n'a pas d'importance. Supposons que les nombres sont des horodatages abstraits et peuvent être réordonnés plus tard. – medley56

Répondre

0

Différez le fichier distant avec votre fichier local et redirigez la sortie du diff vers votre fichier local.

+0

Le problème avec cette solution est que la sortie de diff est en fait assez grande et l'envoi de va-et-vient va à l'encontre du but. – medley56

+0

Oh ok @ medley56. Comment pensez-vous que cela peut être résolu alors? –

+0

J'ai couru plus d'expériences rsync et il semble que tout ce que le fichier "delta" envoie rsync crée très peu de surcharge et s'il est correctement utilisé, rsync fait ce que je veux. Ce que j'ai découvert est que rsync semble toujours copier un fichier entier s'il est sous une certaine taille. Cependant, dès que la taille du fichier dépasse la surcharge du delta, il commence à faire un diff et ne transfère que les données manquantes. – medley56