2010-02-05 10 views
0

J'ai un fichier contenant environ 16 000 lignes d'informations sur les entités. L'utilisateur est supposé télécharger le fichier en utilisant un formulaire de téléchargement HTML, puis le système le gère en lisant ligne par ligne et en créant ensuite des entités put() sur le magasin de données.Moteur d'application - Téléchargement d'un fichier volumineux et analyse de données volumineuses sur la banque de données

Je suis limité par la limite de temps de 30 secondes. J'ai essayé beaucoup de différentes solutions de travail en utilisant la file d'attente de tâches, la redirection HTML forcée, etc. et rien n'a fonctionné pour moi. J'utilise la redirection HTML forcée pour supprimer toutes les données et cela fonctionne, bien que très lentement. (4ème réponse ici: Delete all data for a kind in Google App Engine)

Je ne peux pas sembler l'appliquer à mon problème de téléchargement, puisque ma méthode doit être une méthode POST. Y a-t-il une solution en quelque sorte? Exemple de code serait très apprécié car je suis très nouveau pour le développement web en général.

+1

Quelles solutions de contournement de la file d'attente avez-vous essayées, et pourquoi n'ont-elles pas fonctionné? Il semble que stocker le fichier dans un blob puis l'analyser de manière asynchrone est la meilleure option (seulement?) Que vous avez. –

+1

@Will: Exactement. Si les données sont téléchargées en une fois, mais ne peuvent pas être analysées en une seule fois, elles doivent être stockées quelque part et traitées plus tard et en partie. – balpha

Répondre

2

Pour résoudre un problème similaire, je stockaient le jeu de données dans un modèle avec un seul TextProperty, puis frayer une tâche TaskQueue que:

  1. Récupère un jeu de données du datastore s'il en reste.

  2. Vérifie si la longueur de l'ensemble de données est < = N, où N est un petit nombre d'entités que vous pouvez mettre() sans délai. J'ai utilisé 5. Si oui, écrivez les entités individuelles, supprimez l'enregistrement de jeu de données et générer une nouvelle copie de la tâche. Si la taille de l'ensemble de données était supérieure à N, divisez-la en N parties dans le même format et écrivez-les dans le magasin de données, supprimez l'entité d'origine et générez une nouvelle copie de la tâche.

+0

Cela me semble exact. –

+0

Alors qu'est-ce que le seul TextProperty contient vraiment? Je suis en train de le faire pour obtenir le fichier téléchargé: ftmp = unicode (self.request.get ('monfichier'), 'utf-16') file = ftmp.splitlines() # Maintenant j'ai une liste de toutes les lignes dans le fichier. Suggérez-vous que je stocke ftmp (qui je crois devrait être une chaîne (?) Qui contient le contenu du fichier dans un morceau énorme) dans le seul TextProperty? –

+0

En outre, je reçois ceci quand j'essaye de mettre() ftmp dans un TextProperty. RequestTooLargeError: La demande d'appel de l'API datastore_v3.Put() était trop volumineuse. –

0

Si vous faites cela pour charger des données en masse, pourquoi ne pas utiliser the bulk loader? Si vous avez besoin de l'interface pour être accessible aux utilisateurs non-administrateurs, alors, comme suggéré, vous devez décomposer le fichier en morceaux de taille correcte (en prenant des blocs de n lignes chacun) les mettre dans le magasin de données, et commencer une tâche pour traiter avec chacun d'eux.

Questions connexes