[PYTHON] Expérience de collecte de tweets pendant une longue période (préparation du programme (3))

Jusqu'à la dernière fois

―― [x] D'une manière ou d'une autre, la zone autour de Twitter ressemble à ça, n'est-ce pas?

Ce que tu as à faire

La priorité la plus élevée du côté MongoDB dans ce programme est "** Stockage des données reçues dans MongoDB ". En d'autres termes, selon les spécifications, serait-ce " Enregistrer les données reçues sans les manquer et les stocker pendant 3 mois **"?

Je vais lister les situations possibles pour le moment

Que peut-il se passer lorsque l'entrée dans la base de données échoue?

Je me demande si c'est la seule chose qui m'est venue à l'esprit (parce que c'est une heppoko, je suis désolé pour les aspects techniques).

  1. La personne qui perd la connexion est entre les hôtes locaux, vous n'avez donc pas à vous inquiéter trop, peut-être.
  2. Si la base de données elle-même tombe en panne, je dois penser à une autre contre-mesure, alors j'ai passé cette fois.
  3. Je pense que vous pouvez faire confiance à l'erreur de format car ce sont les données envoyées de Twitter d'une manière simple tant qu'elles sont insérées sans traitement.
  4. J'ai peur d'être mort parce que je ne peux pas suivre le processus.

Je pense que le débit est correct, mais contrairement à la machine de développement avec un processeur et une vitesse de disque relativement abondants, L'environnement d'exécution est Celeron 2,41 GHz et la mémoire est portée à 8 Go (améliorée) . Puisqu'il est également utilisé comme NAS, je pense que l'environnement est assez rude.

Sur la base de l'expérience précédente , on suppose que 2 Go seront inondés par jour. Lorsqu'il est converti en moyenne horaire, il est de 33 Mo / h, et au pic maximum, il est nécessaire de doubler, soit 66 Mo / h.

…… Hmm? Est-ce moins que ce à quoi je m'attendais? ?? Le calcul est-il encore une fois erroné? ?? Je vais le vérifier plus tard. Calculé comme 70 Mo / h, en supposant que les valeurs sont moyennées de manière facile à comprendre. Étant donné que la longueur moyenne des données JSON enregistrées dans Sqlite est de 7 000 octets, elle est de * 10 000 tweets / h *. …… vraiment? Je n'ai pas l'impression qu'il y a un trou quelque part ...

J'essaierai de programmer pour le moment

Pour le moment, j'ai décidé d'écrire un programme en utilisant PyMongo, en le laissant comme un chèque.

pymongotest1.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-

from pymongo import MongoClient

Client = MongoClient()  # Localhost,Aucun paramètre requis pour le port par défaut
db = Client.testdb      #Nom de la base de données: testdb(Créé automatiquement)
Collection = db.testCollection    #collection(table)Nom: testCollection

Collection.insert({"test": "Tesuto"})

...... Eh bien, est-ce que ça va? Tout en réfléchissant, exécutez après avoir installé pymongo. Si vous voulez voir le résultat sur l'interface graphique, il existe un outil appelé Robomongo . C'est gratuit pour une utilisation normale, alors installez-le et exécutez-le rapidement.

実行結果

Contient les données enregistrées. Il semble que "_id" soit automatiquement attribué. Souhaitez-vous vous inscrire plus d'une fois la prochaine fois ...

for i in range(0, 10):
	Collection.insert({"test": "Tesuto"})

J'ai pu m'inscrire. C'est plus facile que vous ne le pensez. Ensuite, j'insérerai Twitter Tweet JSON. Pour les données d'origine, les tweets stockés dans SQLite au moment de la première vérification sont correctement récupérés.

 Collection.insert({"created_at":"Sat Sep 24 15:35:21 +0000 2016", ...(Omis parce que c'est long)... })
NameError: name 'false' is not defined

J'ai une erreur. Si vous le lisez tel quel, faux signifie indéfini… mais c'est vrai. Il doit s'agir de JSON brut. Quand j'ai essayé google, j'ai trouvé une personne qui s'inquiétait pour la même chose immédiatement .

import json

#(Abréviation)

raw_string = r'''{"created_at":"Sat Sep 24 15:35:21 +0000 2016", ...(Omis parce que c'est long)... }'''
json_object = json.loads(raw_string)
Collection.insert(json_object)

J'aimerais pouvoir faire quelque chose comme ça. Je vois, vous pouvez vous inscrire. Ensuite, le suivant est multiple.

raw_string = r'''{"created_at":"Sat Sep 24 15:35:21 +0000 2016", ...(Omis parce que c'est long)... }'''
json_object = json.loads(raw_string)

for i in range(0, 10):
	Collection.insert(json_object)

J'ai une erreur. Il semble que "pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection:", cela signifie donc que vous ne pouvez pas frapper exactement la même chose à plusieurs reprises.

for i in range(0, 10):
	raw_string = r'''{"created_at":"Sat Sep 24 15:35:21 +0000 2016", ...(Omis parce que c'est long)... }'''
	json_object = json.loads(raw_string)

	Collection.insert(json_object)

Si je faisais ça comme ça, ça fonctionnait. On a l'impression que l'identifiant est attribué au stade de json.loads () ... je pense.

Mesure de vitesse

Voyons maintenant à quelle vitesse cela va réellement. Le code de contrôle de vitesse est le suivant.

MongoSpeed.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-

from pymongo import MongoClient
import json

import time    #mesure du temps

Client = MongoClient()
db = Client.testdb
Collection = db.testCollection

start = time.time()   #Commencer la mesure
for i in range(0, 10000):    # 10,000 boucles
	aw_string = r'''{"created_at":"Sat Sep 24 15:35:21 +0000 2016", ...(Omis parce que c'est long)... }'''
	json_object = json.loads(raw_string)
	Collection.insert(json_object)

elapsed_time = time.time() - start   #Calcul du temps écoulé en soustrayant la fin et le début de la mesure
print('Temps d'exécution:', elapsed_time * 1000 ,' [ms]')

Les données JSON sont un peu longues, environ 10 Ko. Il contient 4 URL d'image et des balises de hachage. La plus grande donnée acquise la dernière fois était de 25 Ko et la plus petite de 2 Ko. Est-ce un peu gros par rapport à la moyenne de 7 Ko? Placez les données. ** En d'autres termes, si le temps d'exécution de celui-ci est inférieur à 1 heure, il n'y a presque aucun problème. ** **

(Python) >Python .\MongoSpeed.py

Temps d'exécution: 11719.62308883667 [ms]

(Python) >

Quoi? (à suivre.)

Recommended Posts

Expérience de collecte de tweets pendant une longue période (préparation du programme (3))
Expérience pour collecter des tweets pendant une longue période (préparation du programme (1))
Expérience pour collecter des tweets pendant une longue période (préparation du programme (2))
Expérience pour collecter des tweets pendant une longue période (préparation du programme (5))
Expérimentez pour collecter des tweets pendant une longue période (juste avant l'exécution)
Expérimentez pour collecter des tweets pendant une longue période (agrégation et confirmation du contenu)
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Une méthode d'étude pour les débutants pour apprendre l'analyse des séries chronologiques
Je veux créer un Dockerfile pour le moment.
[Profile] Identifiez les domaines où le programme prend beaucoup de temps (google-perftool)
[Python] Il était très pratique d'utiliser la classe Python pour le programme ROS.
Comment arrêter le programme jusqu'à une date et une heure spécifiques en python
J'ai essayé de créer un linebot (préparation)
Introduction à discord.py (1er jour) -Préparation pour discord.py-
Une solution de contournement simple pour que les robots essaient de publier des tweets avec le même contenu
CentOS 7 avec la configuration LVM prend beaucoup de temps à s'arrêter.