Comment efficace d'insertion et de récupérer l'UUID dans la Base de Données
Je suis à la recherche d'un moyen efficace de stocker et de rechercher l'UUID dans la Base de Données. Ceux UUID sont générés par de nombreux appareils iOS dans un système distribué. Chacun de ces appareils peut stocker environ 20-50k Uuid.
Il est évident que le stockage de l'UUID comme une Chaîne de caractères dans la Base de Données nuira à l'efficacité de l'indexation sur elle. Mais après une série de recherches, j'ai trouvé que stockage UUID comme des Données Binaires dans la Base de Données (et de l'index) peut être moins efficace que de les stocker en tant que Chaîne de.
Comme il n'y a pas de BINAIRE ou VARBINARY comme type de données dans SQLit est pris en charge. Je suppose que tout type de Données Binaire de données dans la Base de Données est stockée comme une GOUTTE dans SQLit. Depuis BLOB pourrait être plus lent type de données à indexer, il va provoquer une mauvaise influence sur la performance.
Donc n'importe qui peut aider à répondre, est-il un moyen plus efficace pour stocker les UUID dans la Base de Données?
L'OP parle Uuid qui sont différents de l'UDID.
vous êtes de droite. L'UUID je l'ai mentionné est l'Identificateur Unique universel pour ManagedObjects créé par mon Application.
OriginalL'auteur Cable W | 2012-07-05
Vous devez vous connecter pour publier un commentaire.
De les stocker dans une chaîne de caractères ASCII, et de rendre le champ de l'index.
MODIFIER
Egads, il m'est arrivé de faire un peu de fouiller le sujet, et suis tombé sur cette. Quel honteux de réponse. Je dois avoir été un peu à l'humeur de la journée. Si je pouvais, je venais de le supprimer et de déplacer sur. Cependant, ce n'est pas possible, je vais donc donner une capture d'une mise à jour.
Première, la seule façon de savoir ce qui est "efficace" est de mesurer, compte tenu du programme de temps et d'espace ainsi que le code source de complexité et de programmeur de l'effort.
Heureusement, celui-ci est assez facile.
J'ai écrit un très simple OSX application. Le modèle se compose d'un seul attribut:
identifier
.Aucune de ces questions, si vous ne marquez pas votre attribut comme un indice. Il faudra beaucoup plus de temps lors de la création de la boutique, mais il va faire des requêtes beaucoup plus rapide.
Aussi, notez que la création d'un prédicat pour un attribut binaire est exactement la même que la création d'un pour une chaîne de caractères:
L'application est très simple. Tout d'abord, il crée des N objets, et attribue un UUID à l'identifiant de l'attribut. Il enregistre le MOC tous les 500 objets. Nous avons ensuite stocker tous les identificateurs dans un tableau et de façon aléatoire shuffle. L'ensemble du CD de la pile est alors démolie complètement pour enlever tout ça de mémoire.
Ensuite, nous construisons la pile à nouveau, puis itérer sur les identifiants, et de faire une simple extraction. L'extraction de l'objet est construit, avec un prédicat simple pour extraire qu'un seul objet. Tout cela est fait à l'intérieur d'un autoreleasepool à garder chaque extraction aussi vierges que possible (je reconnais qu'il y aura une certaine interaction avec le CD caches). Ce n'est pas si important, que nous sommes tout juste en comparant les différentes techniques.
Binaire identifiant est de 16 octets pour l'UUID.
L'UUID de la Chaîne est de 36 octets de la chaîne, le résultat de l'appel [uuid UUIDString], et il ressemble à ceci (B85E91F3-4A0A-4ABB-A049-83B2A8E6085E).
Chaîne Base64 est un 24-octet string, le résultat de l'encodage base 64 16 octets UUID des données binaires, et il ressemble à ceci (uF6R80oKSrugSYOyqOYIXg==) pour le même UUID.
Est le nombre d'objets de cette exécution.
SQLite taille est la taille de la réelle fichier sqlite.
WAL taille est la taille du WAL (write-ahead d'enregistrement de fichier - juste pour info...
Créer est le nombre de secondes pour créer la base de données, y compris l'épargne.
Requête est le nombre de secondes à la requête de chaque objet.
La première chose à noter ici est que la taille de base de données est beaucoup plus grande que les octets stockés (1 600 000 et 16 000 000 d') -, qui est attendue pour une base de données. Le montant de stockage supplémentaire sera un peu par rapport à la taille réelle de vos objets... ce ne stocke l'identifiant de sorte que le pourcentage des frais généraux sera plus élevé).
Deuxième, sur les problèmes de vitesse, de référence, en faisant de même 1 000 000 d'objet de la requête, mais à l'aide de l'objet-id dans le parcours a pris environ 82 secondes (noter la différence marquée entre ça et l'appel de
existingObjectWithID:error:
qui a eu un énorme 0.3065 secondes).Vous devriez profil de votre propre base de données, y compris une utilisation judicieuse des instruments sur le code en cours d'exécution. J'imagine que les chiffres seraient quelque peu différente si je n'avais plusieurs pistes, mais ils sont tellement proches qu'il n'est pas nécessaire pour cette analyse.
Cependant, sur la base de ces chiffres, regardons les mesures de rendement pour l'exécution de code.
Binaire gagne de l'espace par beaucoup, et il peut être considéré comme un proche appuient à la fois sur le temps de création de requête et de temps. Si l'on considère ceux, de stocker les données binaires est le gagnant clair.
Comment sur le code source de complexité et le temps du programmeur?
Bien, si vous utilisez une version moderne de l'iOS et OSX, il n'y a pratiquement pas de différence, surtout avec une simple catégorie sur NSUUID.
Cependant, il est une considération pour vous, et que la facilité d'utilisation des données dans la base de données. Lorsque vous stockez des données binaires, il est difficile d'obtenir une bonne vue sur les données.
Donc, si, pour une raison quelconque, vous voulez que les données dans la base de données d'être stockées de manière plus efficace pour les humains, puis les stocker comme une chaîne de caractères est un meilleur choix. Donc, vous pourriez envisager d'utiliser un encodage base64 (ou un autre encodage -- mais rappelez-vous qu'il est déjà dans la base,-256-codage).
FWIW, voici un exemple de la catégorie de faciliter l'accès à l'UUID à la fois comme NSData et base64 chaîne:
En général, vous voulez vous assurer que toutes les chaînes de votre recherche sont normalisés de façon à exclure de l'unicode. Aussi, au lieu d'utiliser la casse des recherches, de normaliser les données pour supprimer les caractères unicode et cas. Utilisez < et > au lieu de BEGINSWITH, etc. Il y a de grands suggestions dans le 2010, 2011 et 2012 de la WWDC vidéos. Je les recommande fortement.
salut @JodyHagins Pourriez-vous préciser le nom de la WWDC de vidéos sur ce sujet. Il y a beaucoup trop. Merci à l'avance.
Salut @JodyHagins j'ai essayé de sauver l'UUID d'octets à l'aide de la chaîne NSString *utf8String = [NSString stringWithFormat:@"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", uuidBytes.byte0, uuidBytes.byte1, ...... uuidBytes.byte15]; mais que c'est un peu fiable. Les changements de valeur. Donc, pourriez-vous suggérer un bon moyen de convertir un UUID d'une chaîne de caractères ASCII?
Câble de générer un UUID et d'en faire une chaîne d'utiliser ce type de code (ARC):
CFUUIDRef uuidRef = CFUUIDCreate(NULL); NSString *uuid = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuidRef); CFRelease(uuidRef);
OriginalL'auteur Jody Hagins