"# Sujet 4 : Estimation de la latence et de la capacité d’une connexion à partir de mesures asymétriques"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On commence par déclarer les bibliothèques utilisés :\n",
"\n",
"Note : `urllib.request` n'y est pas car elle n'est utilisée que dans le cas où on doit télécharger les données."
]
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": 1,
"execution_count": 1,
"metadata": {},
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import re\n",
"import gzip\n",
"import time\n",
"import pandas\n",
"import io\n",
"import os"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On commence par récupérer les données à étudier :"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
"outputs": [
{
{
"name": "stdout",
"name": "stdout",
"output_type": "stream",
"output_type": "stream",
"text": [
"text": [
"Les données n'existent pas en local, on les télécharges.\n",
"Les données sont déjà présentes en local.\n"
"Fichier récupéré.\n"
]
]
}
}
],
],
...
@@ -22,7 +59,6 @@
...
@@ -22,7 +59,6 @@
"if data_file[-7:] != \".log.gz\":\n",
"if data_file[-7:] != \".log.gz\":\n",
" raise Exception(\"Le fichier nom de fichier \"+data_file+\" ne finit pas par \\\".log.gz\\\" !\")\n",
" raise Exception(\"Le fichier nom de fichier \"+data_file+\" ne finit pas par \\\".log.gz\\\" !\")\n",
"\n",
"\n",
"import os\n",
"if not os.access(data_file, os.R_OK):\n",
"if not os.access(data_file, os.R_OK):\n",
" import urllib.request\n",
" import urllib.request\n",
" print(\"Les données n'existent pas en local, on les télécharges.\")\n",
" print(\"Les données n'existent pas en local, on les télécharges.\")\n",
...
@@ -35,12 +71,579 @@
...
@@ -35,12 +71,579 @@
" print(\"Les données sont déjà présentes en local.\")"
" print(\"Les données sont déjà présentes en local.\")"
]
]
},
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On définit la fonction qui va lire chaque ligne pour en extraire les données. La ligne retournée sera formatée en CSV.\n",
"\n",
"Comme ce qui nous intéresse est le temps mis pour latence (ou \"ping\") il faut impérativement que celle ci soit présente pour que la ligne soit reconnue, pour les lignes dans ce cas on retournera `Ǹone`.\n",
"\n",
"Si la ligne est totalement illisible on soulèvera une exception afin d'avertir l'utilisateur qu'il y a des lignes dont le format est illisible par le programme. Ceci est préférable au fait de retourner `Ǹone` car si c'était le cas on risquerait de masquer des données utiles, par exemple si `ping` avait retourné des données en secondes plutôt qu'en millisecondes."
]
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": 3,
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [
"source": []
{
"name": "stdout",
"output_type": "stream",
"text": [
"1421761682.052172,665,22.5\n",
"\n",
"None\n",
"\n",
"Exception (attendue) : La ligne \"[1421761682.052172] 665 bytes from lig-publig.imag.fr (129.88.11.7): icmp_seq=1 ttl=60 time=22.5 s\" n'est pas dans le format attendu.\n"
" raise Exception(\"La ligne \\\"\"+line+\"\\\" n'est pas dans le format attendu.\")\n",
"\n",
"# Quelques essais\n",
"print(extractDataFromLine(\"[1421761682.052172] 665 bytes from lig-publig.imag.fr (129.88.11.7): icmp_seq=1 ttl=60 time=22.5 ms\")) # Le retour à la ligne est inclus dans ce qui est retourné\n",
"print(extractDataFromLine(\"[1421773281.582445] 13 bytes from stackoverflow.com (198.252.206.140): icmp_seq=1 ttl=50\"))\n",
" print(\"On devrait avoir une exception ici.\")\n",
"except Exception as e:\n",
" print(\"Exception (attendue) : \"+e.args[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lit les données du fichier, utilise la fonction `extractDataFromLine` définit précédemment pour extraire les données et les placer dans une variables `csv_data` qui contiendra les données au format CSV.\n",
"\n",
"J'ai dans un premier temps essayé de ne pas passer par une variable intermédiaire et ajouter les données directement dans le DataFrame mais c'était extrêmement lent. Il aurait aussi été possible de passer par un fichier intermédiaire. En cas de données plus imposantes cela aurait été nécessaire."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Lu 44413 lignes en 0.185 sec\n"
]
}
],
"source": [
"nb = 0\n",
"start_time = time.time()\n",
"csv_data = '\"date\",\"size\",\"time\"\\n' # La première ligne du CSV à les noms de champs\n",
"Traduit le tableau du format CSV en temps que DataFrame pandas. Comme on lit depuis le contenu d'une variable on utilise `io.StringIO` qui permet de lire une variable comme on lit un fichier."