2010-12-12 3 views
1

J'ai une grande liste de mots (plus de 2 millions) dans un fichier CSV (taille d'environ 35 Mo). Je voulais importer le fichier CSV dans sqlite3 avec index (clé primaire). Donc je l'ai importé en utilisant l'outil de ligne de commande sqlite. La base de données a été créée et la taille du fichier .sqlite a dépassé 120 Mo! (50% en raison de l'index de clé primaire)Comment importer une grande quantité de données à partir de fichier à sqlite dans l'application (en temps réel)

Et voici le problème: si j'ajoute ce fichier .sqlite de 120 Mo. même après avoir compressé le fichier .ipa, il a> 60 Mo. Et j'aimerais que ce soit moins de 30Mo (à cause de la limitation par E/3G).

Aussi en raison de la taille je ne peux pas l'importer (fichier sqlite compressé) par un service Web (45 Mo * 1000 téléchargement = 45 Go! C'est la limite de la moitié de mon serveur).

Je pensais que je pouvais faire quelque chose comme ceci:

  1. compresse le fichier CSV avec des mots à ZIP et que le fichier aura fichier seulement 7 Mo.
  2. Ajouter un fichier ZIP aux ressources.
  3. dans l'application Je peux décompresser le fichier et importer des données à partir du fichier CSV décompressé vers sqlite.

Mais je ne sais pas comment faire. J'ai essayé de faire ceci:

mais cela ne fonctionne pas. La raison de l'échec est ".import" est une partie de l'interface de ligne de commande et non dans l'API C.

J'ai donc besoin de savoir comment l'importer (fichier CSV décompressé) dans le fichier SQLite à l'intérieur de l'application (pas pendant le développement en utilisant la ligne de commande).

+0

est-ce lié? http://stackoverflow.com/questions/455606/how-to-import-file-into-sqlite – nacho4d

+0

non. Je l'ai lu. Il n'y a pas de réponse à ma question dans le cas. – konradowy

+0

comme note de site Ya? ai-je raison? – basarat

Répondre

0

La solution la plus simple consisterait à écrire un analyseur CSV à l'aide de NSScanner et à insérer les lignes dans la base de données une par une. C'est en fait un travail assez facile - vous pouvez trouver un parseur CSV complet here.

+0

Je ne sais pas si c'est une bonne idée d'insérer 2+ milions de lignes dans la base de données une par une ... – konradowy

+0

Non, ce n'est pas le cas, et cela nécessitera probablement un temps d'initialisation déraisonnable. Mais c'est exactement ce que fait l'utilitaire de ligne de commande. –

+1

Avez-vous envisagé de placer le fichier sur un service de cloud comme le S3 d'Amazon et de permettre à l'application de le télécharger à partir de là?Ce sera très peu coûteux, même si vous avez beaucoup de téléchargements (1 Go est seulement 0,15 $ ou plus, je crois). –

2

Si les mots que vous insérez sont uniques, vous pourriez faire du texte la clé primaire. Si vous voulez seulement tester si les mots existent dans un ensemble (disons pour un vérificateur d'orthographe), vous pouvez utiliser une autre structure de données telle qu'un filtre bloom, qui ne nécessite que 9,6 bits pour chaque mot avec 1% de faux positifs .

http://en.wikipedia.org/wiki/Bloom_filter

+0

J'ai besoin des données complètes, mais thx (+1) c'est une bonne idée pour l'avenir de toute façon – konradowy

1

Comme mentionné FlightOfStairs selon les exigences d'un filtre bloom est une solution, si vous avez besoin des données complètes Une autre solution consiste à utiliser une structure de données trie ou radix tree. Vous prétraitez vos données et construisez ces structures de données, puis vous les placez dans sqlite ou dans un autre format de données externe.

Questions connexes