2012-06-08 2 views
1

J'essaie de savoir si je peux utiliser protobuf-net pour stocker et récupérer la structure de données sérialisé suivantes:Protobuf Net et le stockage/récupération des blobs de données vers/depuis un fichier binaire

J'ai environ 200 000 objets de taille 16 octets (l'objet contient un long et deux valeurs de type flottant, 8 octets plus 2 * 4 octets) chaque jour que j'aime stocker dans un fichier binaire. Par exemple, je voudrais demander des objets entre le 1er avril 2012 et le 6 avril 2012, qui doivent être lus à partir du 1er avril, puis le 2 avril, le 6 avril. Une exigence est que l'accès doit être aléatoire, ce qui signifie, Le fichier peut contenir des données de 2010 à Juin 2012 mais je ne souhaite que récupérer des éléments entre le 1er avril et le 6 avril 2012 sans avoir à lire tous les éléments depuis le début.

Je stocke actuellement les données sous forme de tableaux d'octets contigus dans l'ordre de DateTimeTick mais sans tenir compte du début ou de la fin d'un nouveau jour. Si je pouvais utiliser protbuf-net pour diffuser les données en tant que "blobs" d'une journée entière comme IEnumerable, ce serait formidable. Est-ce possible? Je pensais stocker un IEnumerable ou List pour chaque jour sérialisé avec protobuf-net mais je ne suis pas sûr de savoir comment accéder aléatoirement à une liste particulière plus tard? Des idées ou des suggestions? Merci

Répondre

1

Ce n'est pas un typique cas d'utilisation pour protobuf-net, et alors que je pense qu'il serait possible de l'utiliser cette façon, ce ne serait pas mon instinct d'essayer de le faire. Si l'exigence clé est de diviser par jour, l'utilisation de plusieurs fichiers serait un choix évident. Vous pouvez également modifier votre format de fichier existant pour inclure (par jour) l'horodatage et la taille des données pour ce jour. Vous pouvez ensuite avancer simplement en jours entiers à l'aide de la propriété FileStream.Position.

protobuf-net ne ont des API de streaming et de sauter, ou un « lecteur » premières API si vous ne voulez pas impliquer le sérialiseur de base, mais: Je ne suis pas sûr que cela va vous aider à massivement. Franchement, puisque (dans votre processus actuel) chaque morceau est de taille fixe, vous pouvez aussi utiliser la recherche binaire (peut-être en utilisant une interpolation linéaire pour la position de départ) pour chercher juste au bon moment.

+0

Merci pour vos commentaires. Si je devais stocker chaque jour dans un fichier séparé recommanderiez-vous de stocker les objets en tant que List ou IEnumerable sérialisé avec protobuf-net ou serait-il plus rapide de simplement stocker et récupérer tous les tableaux d'octets bruts pour un jour donné? –

+0

@Freddy si vous avez quelque chose qui fonctionne, je m'en tiendrai à cela. protobuf-net est efficace, mais doit encore faire un certain niveau de traitement car le format est plus structuré et flexible. Il souhaiterait également ajouter des en-têtes (très laconiques, c'est-à-dire 1 octet par champ généralement) dans la sortie. Dans le cas que vous décrivez, où les données sont très simples (c'est-à-dire non structurées, avec des données imbriquées/internes et avec une disposition prévisible), je ne suis pas sûr que protobuf-net va vous acheter quelque chose. Là où il excelle gère la sérialisation plus générale des objets, qui peut être complexe, et qui doit être ... –

+0

... extensible au fil du temps afin que les gens puissent facilement "versionner" les données (à un moment donné un nouveau champ est ajouté), ou en manipulant des arbres d'objets complexes (A a une liste de B, chacun ayant un C et un D, ​​et divers autres champs à tous les niveaux). –

Questions connexes