OPTIMISATION ET FIABILISATION D UNITEX. ou du labo à l iphone...

Documents pareils
Le prototype de la fonction main()

Introduction au langage C

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Systeme d'exploitation

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Chapitre 2 : Abstraction et Virtualisation

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

DLTA Deploy. Une offre unique de gestion de flotte mobile pour iphone, ipad & ipod touch. La solution de gestion de flotte mobile pour ios

as Architecture des Systèmes d Information

3IS - Système d'exploitation linux - Programmation système

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Une introduction à Java

La technologie Java Card TM

Programmation système I Les entrées/sorties

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Compression de Données - Algorithme de Huffman Document de Conception

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Derrière toi Une machine virtuelle!

Cours Java Native Interface

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Programmer en JAVA. par Tama

Notions fondamentales du langage C# Version 1.0

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Un serveur web léger et ouvert

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Cours 1: Java et les objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

OS Réseaux et Programmation Système - C5

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

BUREAU VIRTUEL. Utilisation de l application sur ipad. Guide utilisateur. Sciences Po Utilisation du bureau virtuel sur ipad 1 / 6

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

Corrigé des exercices sur les références

Guide d installation de MySQL

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Génération de code binaire pour application multimedia : une approche au vol

Plan du cours. Historique du langage Nouveautés de Java 7

Optimisations des SGBDR. Étude de cas : MySQL

Initiation. àl algorithmique et à la programmation. en C

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

CNAM Déploiement d une application avec EC2 ( Cloud Amazon ) Auteur : Thierry Kauffmann Paris, Décembre 2010

Lier Erlang avec d autres langages de programmation

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Programmation C. Apprendre à développer des programmes simples dans le langage C

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Point sur les solutions de développement d apps pour les périphériques mobiles

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Projet de programmation (IK3) : TP n 1 Correction

Auto-évaluation Programmation en Java

Chapitre 10. Les interfaces Comparable et Comparator 1

de logiciels Web 2.0, SaaS Logiciels collaboratifs Portails pour entreprises Développement iphone, Android WebApp HTML5 Mobile marketing

IFT Systèmes d exploitation - TP n 1-20%

COMPARAISONDESLANGAGESC, C++, JAVA ET

Java Licence Professionnelle CISII,

Introduction aux Machines Virtuelles avec VMKit

Catalogue des stages Ercom 2013

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Architecture distribuée

Module.NET 3 Les Assemblys.NET

Programmation en Java IUT GEII (MC-II1) 1

Corrigés des premiers exercices sur les classes

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Eclipse atelier Java

La base de données XML exist. A. Belaïd

Généralités sur le Langage Java et éléments syntaxiques.

La carte à puce. Jean-Philippe Babau

Programmation avancée et répartie en Java : interfaçage avec d autres langages

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

INF 104 (SELC) Introduction au langage C

Manuel d'installation

Cours Programmation Système

Introduction au calcul parallèle avec OpenCL

Java - la plateforme

Utilisation d objets : String et ArrayList

Programmation système en C/C++

INFO-F-404 : Techniques avancées de systèmes d exploitation

Java et les bases de données

Cours de C. Allocation dynamique. Sébastien Paumier

Introduction à la programmation concurrente

Le langage C. Séance n 4

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Travailler à l'ensimag avec son matériel personnel

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Problèmes liés à la concurrence

Conventions d écriture et outils de mise au point

Can we trust smartphones?

Programmation système de commandes en C

Base de connaissances

Mise en œuvre d une solution de virtualisation

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

µrv : Realité Virtuelle

Transcription:

OPTIMISATION ET FIABILISATION D UNITEX ou du labo à l iphone...

FRANÇOIS LIGER Co-fondateur et CEO GILLES VOLLANT Co-fondateur et développeur ANASTASIA YANNACOPOULOU Co-fondatrice et linguiste en chef francois@ergonotics.com gilles@ergonotics.com anastasia@ergonotics.com

ERGONOTICS

CONVEX le convertisseur malin pour ios la télécommande intelligente pour Freebox

CONVEX Le convertisseur malin pour ios F 633 000 téléchargements z Dans 110 pays B #1 sur l AppStore (14 marchés)

DÉFIS Fiabilité Mémoire Performance Multiplateforme

MULTIPLATEFORME amélioration du support multiplateforme Mobile : ios, Androïd, Windows RT Serveur : Linux, Windows, Mac Support multiple pour les compilateurs : GCC, LLVM, Visual Studio

FIABILITÉ Le code était globalement propre mais Quelques fuites mémoire Quelques problèmes de multi-threading Dur à tester Pas de mécanisme de reproduction systématique

LOGGER Enregistre chaque opération and permet de la rejouer Aide à la prévention des régressions Chaque modification peut être testée avec tout le jeu de tests pour valider son innocuité Si une modification ou un use case révèle un nouveau bug non détecté par le jeu de test, il suffit de l ajouter au jeu de tests

PERFORMANCE Point de départ Phrase traitée en 0,8s en moyenne Notre impératif Traitement quasi-temps réel

Code OpenSource Améliorations propriétaires

PASSAGE EN LIBRAIRIE À l origine, collection d exécutables indépendants Amélioration de la vitesse (démarrage de chaque exécutable) Modèle d application monolithique pour les mobiles Nécessité de supprimer les fuites mémoire et d une meilleure gestion des erreurs

API C int UnitexTool_public_run(int argc,char* const argv[],int* p_number_done,struct pos_tools_in_arg* ptia); int UnitexTool_public_run_one_tool(const char*toolname,int argc,char* const argv[]);

JNI public native static int execunitextool(string[] cmdarray); public native static int execunitextool(string cmdline);

Exemple UnitexJni.execUnitexTool(new String[] {"UnitexToolLogger","Normalize",PFX+txt,"- r"+dirres+"norm.txt"});

VIRTUALISATION Sans virtualiser les fichiers, Unitex écrit le résultat de chaque commande sur le disque dur. Problèmes de performances importants, et même d usure du matériel Création d un espace de fichier virtuel et stockage des fichiers uniquement en mémoire. Les fichiers virtuels se reconnaissent à leur préfixe, qui permet à Unitex de savoir si il s adresse au système de fichier virtuel ou au «vrai» système de fichier Deux implémentations : la notre et celle d Unitex 3

API C void GetUnitexFileReadBuffer(const char*name,unitexfilemapped** amf, const void**buffer,size_t *size_file); void CloseUnitexFileReadBuffer(UNITEXFILEMAPPED *,const void*buffer,size_t size_file); int WriteUnitexFile(const char*name,const void*buffer_prefix,size_t size_prefix,const void*buffer_suffix,size_t size_suffix); int AppendUnitexFile(const char*name,const void*buffer_data,size_t size_data); int RemoveUnitexFile(const char*name); int RenameUnitexFile(const char*oldname,const char*newname); int CopyUnitexFile(const char*srcname,const char*dstname); int CreateUnitexFolder(const char*name); int RemoveUnitexFolder(const char*name); int UnitexAbstractPathExists(const char* path);

API Java public native static boolean writeunitexfile(string filename, char[] filecontent); public native static boolean writeunitexfile(string filename, byte[] filecontent); public native static boolean writeunitexfile(string filename, String filecontent); public native static boolean writeunitexfileutf(string filename, String filecontent); public native static boolean writeunitexfileutf(string filename, String filecontent, boolean isbom); public native static boolean appendunitexfile(string filename, byte[] filecontent); public native static char[] getunitexfiledatachar(string filename); public native static byte[] getunitexfiledata(string filename); public native static String getunitexfilestring(string filename); public native static boolean removeunitexfile(string filename); public native static boolean createunitexfolder(string foldername); public native static boolean removeunitexfolder(string foldername); public native static boolean renameunitexfile(string filenamesrc, String filenamedst); public native static boolean copyunitexfile(string filenamesrc, String filenamedst);

PERSISTANCE Les dictionnaires et graphes sont gros (surtout les dictionnaires), et complexe à charger (surtout les graphes) Les recharger à chaque exécution de Dico et Locate est couteux La persistence permet de les charger une fois pour toute à l initialisation de l application Deux implémentations : la notre et celle d Unitex 3

API C int persistence_public_load_dictionary(const char*filename,char* persistent_filename_buffer,size_t buffer_size); void persistence_public_unload_dictionary(const char*filename); int persistence_public_load_fst2(const char*filename,char* persistent_filename_buffer,size_t buffer_size); void persistence_public_unload_fst2(const char*filename); int persistence_public_load_alphabet(const char*filename,char* persistent_filename_buffer,size_t buffer_size); void persistence_public_unload_alphabet(const char*filename);

API Java public native static String loadpersistentdictionary(string filename); public native static void freepersistentdictionary(string filename); public native static String loadpersistentfst2(string filename); public native static void freepersistentfst2(string filename); public native static String loadpersistentalphabet(string filename); public native static void freepersistentalphabet(string filename);

ALLOCATEURS PERSONNALISÉS UNITEX passe beaucoup de temps à gérer les allocations et désallocations mémoire Permet l optimisation en fonction des cas d usage souhaités Personnalisation des allocateurs par outils Complémentarité avec la persistance, en particulier pour les graphes Implémentation propriétaire Ergonotics

SUPPRESSION DES SORTIES Permet de supprimer les sorties d Unitex sur la console API C int SetStdWriteCB(enum stdwrite_kind swk, int trashoutput, t_fnc_stdoutwrite fnc_stdoutwrite, void* privateptr); int GetStdWriteCB(enum stdwrite_kind swk, int* p_trashoutput, t_fnc_stdoutwrite* p_fnc_stdoutwrite, void** p_privateptr); API Java public native static boolean setstdouttrashmode(boolean flushmode); public native static boolean setstderrtrashmode(boolean flushmode);

MULTI-THREADING Modifications dans Unitex suppression de toute les variables globales Adaptation des espaces de virtualisation et de persistence

NOTRE CONTRIBUTION Nous avons ajouté à Unitex ce qui nous manquait pour pouvoir l utiliser dans un cadre industriel Performance, Fiabilité, Logger API de virtualisation permettant d intégrer des gestionnaires de virtualisation, persistance et allocateur mémoire personnalisé La grande majorité de nos améliorations a été reversée gratuitement dans le domaine public http://igm.univ-mlv.fr/~unitex/ufo.pdf

AU DELÀ... Un gestionnaire de persistance de ressource et système de fichier virtuel optimisé, compatible multi-thread (notre implémentation) Un gestionnaire d allocation mémoire spécifique et optimisé par opération Un format de fichier graphe binaire optimisé en vitesse de chargement et en taille, offrant la possibilité de crypter les graphes sur disque Un format binaire INP remplaçant le format INF pour les dictionnaires, immédiat à charger et ne demandant pas d allocation mémoire

Exemple C #include <stdlib.h> #include <string.h> #include <stdio.h> #include "UnitexTool.h" #include "UnitexLibIO.h" #include "PersistenceInterface.h" #include "SyncTool.h" #include "AbstractFilePlugCallback.h" #ifdef HAS_UNITEX_NAMESPACE using namespace unitex; #endif #ifdef _NOT_UNDER_WINDOWS #define UNITEX_PATH_SEPARATOR_CHAR '/' #define UNITEX_PATH_SEPARATOR_STRING "/" #else #define UNITEX_PATH_SEPARATOR_CHAR '\\' #define UNITEX_PATH_SEPARATOR_STRING "\\" #endif const char* getvirtualfilepfx() { if (UnitexAbstractPathExists("*")!= 0) return "*"; if (UnitexAbstractPathExists("$:")!= 0) return "$:"; } return "";

Exemple C char* combineunitexfilecomponent(const char* resource_folder,const char* filename) { if (resource_folder == NULL) resource_folder = ""; if (filename == NULL) filename = ""; size_t len_resource = strlen(resource_folder); size_t len_filename = strlen(filename); char* buffer = (char*)malloc(len_resource+len_filename+4); int must_add_separator = 0; if (len_resource > 0) { char last_folder_char = * (resource_folder + len_resource - 1); must_add_separator = ((last_folder_char == '\\') (last_folder_char == '/'))? 0 : 1; } } memcpy(buffer,resource_folder,len_resource); if (must_add_separator!= 0) *(buffer + len_resource) = UNITEX_PATH_SEPARATOR_CHAR; memcpy(buffer + len_resource + must_add_separator,filename,len_filename); *(buffer + len_resource + must_add_separator + len_filename) = '\0'; return buffer;

Exemple C void* processunitexwork(const char* alphabetname,const char* normfullpath, const char* dictionaryfullname,const char* graphfullfilename, const char* corpuspath, const void* buffer_prefix,size_t size_prefix,const void*buffer_suffix,size_t size_suffix, const char* inputcorpusencoding, const char* outputcorpusencoding) { char* originalcorpustextfilenametxt = combineunitexfilecomponent(corpuspath,"corpus.txt") ; char* originalcorpustextfilenamesnt = combineunitexfilecomponent(corpuspath,"corpus.snt") ; char* originalcorpustextfilenamesntdir = combineunitexfilecomponent(corpuspath,"corpus_snt") ; char* originalcorpustextfilenameconcordind = combineunitexfilecomponent(originalcorpustextfilenamesntdir,"concord.ind") ; SetStdWriteCB(stdwrite_kind_out, 1, NULL,NULL); SetStdWriteCB(stdwrite_kind_err, 1, NULL,NULL); CreateUnitexFolder(originalCorpusTextFileNameSntDir); int result_write = WriteUnitexFile(originalCorpusTextFileNameTxt,buffer_prefix,size_prefix,buffer_suffix,size_suffix); WriteUnitexFile("y:\\avir\\iii.txt",buffer_prefix,size_prefix,buffer_suffix,size_suffix); const char *Normalize_Argv[] = {"UnitexTool","Normalize",originalCorpusTextFileNameTxt,"-r",normFullPath,"- k",inputcorpusencoding}; int nb_normalize_argv = 7; if (inputcorpusencoding == NULL) nb_normalize_argv = 5; else if ((*inputcorpusencoding) == '\0') nb_normalize_argv = 5; int result_normalize = UnitexTool_public_run(nb_Normalize_Argv,(char**)Normalize_Argv,NULL,NULL); const char *Tokenize_Argv[] = {"UnitexTool","Tokenize",originalCorpusTextFileNameSnt,"-a",alphabetName}; int nb_tokenize_argv = 5; int result_tokenize = UnitexTool_public_run(nb_Tokenize_Argv,(char**)Tokenize_Argv,NULL,NULL); const char *Dico_Argv[] = {"UnitexTool","Dico","-t",originalCorpusTextFileNameSnt,"-a",alphabetName,dictionaryFullName}; int nb_dico_argv = 7; int result_dico = UnitexTool_public_run(nb_Dico_Argv,(char**)Dico_Argv,NULL,NULL); const char *Locate_Argv[] = {"UnitexTool","Locate","-t",originalCorpusTextFileNameSnt,"-a",alphabetName, "-L","-R","--all","-b","-Y",graphFullFileName, "-q",outputcorpusencoding };

Exemple C int nb_locate_argv = 14; if (outputcorpusencoding == NULL) nb_locate_argv = 12; else if ((*outputcorpusencoding) == '\0') nb_locate_argv = 12; int result_locate = UnitexTool_public_run(nb_Locate_Argv,(char**)Locate_Argv,NULL,NULL); int result_concord = 0; if ((result_write!= 0) (result_normalize!= 0) (result_tokenize!= 0) (result_dico!= 0) (result_locate!= 0) (result_concord!= 0)) return NULL; UNITEXFILEMAPPED *amf=null; const void*pbufsnt = NULL; size_t sizesnt = 0; GetUnitexFileReadBuffer(originalCorpusTextFileNameConcordInd,&amf,&pBufSnt,&sizeSnt); void * return_buffer = (void*)malloc(sizesnt+8); if (return_buffer!= NULL) { memcpy(return_buffer,pbufsnt,sizesnt); for (size_t walk=0;walk<8;walk++) { *(((char*)return_buffer) + sizesnt + walk) = '\0'; } } CloseUnitexFileReadBuffer(amf, pbufsnt, sizesnt); } free(originalcorpustextfilenametxt); free(originalcorpustextfilenamesnt); free(originalcorpustextfilenamesntdir); free(originalcorpustextfilenameconcordind); return return_buffer;

Exemple C int main(int argc, char** argv) { if (argc < 2) { // usage(); return 0; } const char* pfx_prefix = getvirtualfilepfx(); //pfx_prefix="y:\\avir\\wrkuni\\"; const char* ressourcedir=*(argv+1); int nbloop = 1; if (argc > 2) nbloop=atoi(*(argv+2)); int persist = 1; if (argc > 3) persist=atoi(*(argv+3)); char* graphresdir = combineunitexfilecomponent(ressourcedir, "graph"); char* dictionnaryresdir = combineunitexfilecomponent(ressourcedir, "dictionnary"); char* othersresdir = combineunitexfilecomponent(ressourcedir, "others"); char* AlphabetName = combineunitexfilecomponent(othersresdir,"alphabet.txt"); char* normfullpath = combineunitexfilecomponent(othersresdir,"norm.txt"); char* dictionnaryname = combineunitexfilecomponent(dictionnaryresdir, "dela-en-public.bin"); char* graphname = combineunitexfilecomponent(graphresdir, "AAA-hoursgilles.fst2"); char AlphabetNamePersisted[0x200]; char dictionnarynamepersisted[0x200]; char graphnamepersisted[0x200]; char norminvfs[0x200]; if (persist) { persistence_public_load_alphabet(alphabetname,alphabetnamepersisted,sizeof(alphabetnamepersisted)-1); persistence_public_load_dictionary(dictionnaryname,dictionnarynamepersisted,sizeof(dictionnarynamepersisted)-1); persistence_public_load_fst2(graphname,graphnamepersisted,sizeof(graphnamepersisted)-1); sprintf(norminvfs,"%sresinvfs%cnorm.txt",pfx_prefix,unitex_path_separator_char); CopyUnitexFile(normFullPath,normInVfs); } else { strcpy(alphabetnamepersisted,alphabetname); strcpy(dictionnarynamepersisted,dictionnaryname); strcpy(graphnamepersisted,graphname); strcpy(norminvfs,normfullpath); }

Exemple C char corpusfolder[0x80]; char workdirectoryname[0x100]; size_t arbitraty_unique_value = 0; arbitraty_unique_value = (size_t)(&arbitraty_unique_value); sprintf(corpusfolder,"%scorpusfolder",pfx_prefix); CreateUnitexFolder(corpusFolder); /* now the work, it can be splitted in several thread */ sprintf(workdirectoryname,"%s%cworkunitexthread_%08lx%08lx",corpusfolder,unitex_path_separator_char, ((unsigned long)((arbitraty_unique_value>>16)>>16)),((unsigned long)(arbitraty_unique_value))); CreateUnitexFolder(workDirectoryName); htimeelapsed beginall = SyncBuidTimeMarkerObject(); for (int i=0;i<nbloop;i++) { const char* inputstring = "I want watch at 4:00 am see at 6:00 pm before leave at 15.47"; char* stringresult = (char*)processunitexwork( AlphabetNamePersisted,normInVfs,dictionnaryNamePersisted,graphNamePersisted,workDirectoryName, NULL,0,inputString,strlen(inputString),"utf8-no-bom,bom","utf8-no-bom"); if (stringresult!= NULL) { if ((i+1) == nbloop) printf("result is %s\n",stringresult); free(stringresult); } } unsigned int alltimemsec = SyncGetMSecElapsed(beginAll); RemoveUnitexFolder(workDirectoryName); /* work finish, cleanup */ printf("all time %d msec (%d msec by run)\n",alltimemsec,alltimemsec/nbloop); if (persist) { persistence_public_unload_dictionary(dictionnarynamepersisted); persistence_public_unload_fst2(graphnamepersisted); RemoveUnitexFile(normInVfs); } free(alphabetname); free(graphresdir); free(dictionnaryresdir); free(othersresdir); } free(dictionnaryname); free(graphname); free(normfullpath); return 0;

MERCI http://www.ergonotics.com/unitex-contribution/ unitex-contribution@ergonotics.com francois@ergonotics.com gilles@ergonotics.com anastasia@ergonotics.com