OpenSSL VPN Serveurs de messagerie |
Boost/Boost-regexBoost.Boost-regex HistoryHide minor edits - Show changes to markup Changed line 7 from:
Dans le cadre de mon projet, l'objectif était de traiter plus de un giga octets de logs dans des temps très courts. Je décide d'implémenter la technique des memoryMappedFile. Cette technique d'accès aux fichiers est très performante, le principe est de mapper, par des appels à l'API système, la zone de données de l'application directement sur le disque dur de la même façon que le fait Windows avec sa mémoire virtuelle (swap disk). Bien que le disque soit d'une lenteur incomparable à celle de la mémoire vide, le gain de temps se fait sur l'allocation mémoire et le chargement des données ce qui donne des performances excellentes, le gain de temps obtenu est de l'ordre de trois et n'est pas sensible à la taille du fichier traité (problématique du swap en cas de chargement en mémoire).\\ to:
Dans le cadre de mon projet, l'objectif était de traiter plusieurs gigas octets de logs dans les meilleurs délais pour cela je décide d'implémenter la technique des memoryMappedFile. Cette technique d'accès aux fichiers est très performante, le principe est de mapper, par des appels à l'API système, la zone de données de l'application sur le disque dur de la même façon que le fait Windows avec sa mémoire virtuelle (swap disk). Bien que le disque soit d'une lenteur incomparable à celle de la mémoire vide, le gain de temps se fait sur l'allocation mémoire et le chargement des données ce qui donne des performances excellentes. Le gain de temps obtenu est de l'ordre de trois et n'est pas sensible à la taille du fichier traité (problématique du swap en cas de chargement en mémoire).\\ Changed line 164 from:
Sur un fichier de 70Mo, sous Windows, le temps de traitement ne dépasse pas 12 secondes (à la permière exécution, car un cache accélere grandement les choses par la suite) et atteint 30 secondes par la méthode classique. Sous AIX, le rapport entre les deux méthodes est le même et je n'ai pas observé de variation entre deux exécutions. A noter, que bien que la machine AIX utilisée pour mes tests date d'environ six ans, les temps de traitement mesurés étaient deux fois meilleurs que ceux obtenus sous Windows ce qui semble montrer l'extrême importance des performances des disques (une baie de stockage pour AIX et un disque IDE pour Windows).\\ to:
Sur un fichier de 70Mo, sous Windows, le temps de traitement ne dépasse pas 12 secondes (à la première exécution, car un cache accélere grandement les choses par la suite) et atteint 30 secondes par la méthode classique. Sous AIX, le rapport entre les deux méthodes est très proche car je n'ai pas observé de variation entre deux exécutions. A noter, que bien que la machine AIX utilisée pour mes tests date d'environ six ans, les temps de traitement mesurés étaient deux fois meilleurs que ceux obtenus sous Windows ce qui semble montrer l'extrême importance des performances des disques (une baie de stockage connectée en fiber channel pour AIX et un disque IDE pour Windows).\\ Added lines 1-4:
http://www.grandville.net/pub/img/GB.gif http://www.grandville.net/pub/img/D.gif Changed line 160 from:
Sur un fichier de 70Mo, sous Windows, le temps de traitement ne dépasse pas 12 secondes (à la permière exécution, car un cache accélere grandement les choses par la suite) et atteint 30 secondes par la méthode classique. Sous AIX, le rapport entre les deux méthodes est le même et je n'ai pas observé de variation entre deux exécutions. A noter, que bien que la machine AIX utilisée pour mes tests date d'environ six ans, les temps de traitement mesurés étaient deux fois supérieurs à ceux obtenus sous Windows ce qui semble montrer l'extrême importance des performances des disques (une baie de stockage pour AIX et un disque IDE pour Windows).\\ to:
Sur un fichier de 70Mo, sous Windows, le temps de traitement ne dépasse pas 12 secondes (à la permière exécution, car un cache accélere grandement les choses par la suite) et atteint 30 secondes par la méthode classique. Sous AIX, le rapport entre les deux méthodes est le même et je n'ai pas observé de variation entre deux exécutions. A noter, que bien que la machine AIX utilisée pour mes tests date d'environ six ans, les temps de traitement mesurés étaient deux fois meilleurs que ceux obtenus sous Windows ce qui semble montrer l'extrême importance des performances des disques (une baie de stockage pour AIX et un disque IDE pour Windows).\\ Changed lines 3-5 from:
Dans le cadre de mon projet, l'objectif était de traiter plus de un giga octets de logs dans des temps très courts. Ayant connaissance des memoryMappedFile qui est une technique d'accès aux fichiers très performante dont le principe de fonctionnement est de mapper, par des appels à l'API système, la zone de données de l'application directement sur le disque dur de la même façon que le fait Windows avec sa mémoire virtuelle (swap disk). Bien que le disque soit d'une lenteur incomparable à celle de la mémoire vide, dans notre cas, le gain de temps fait sur l'allocation mémoire et le chargement des données est substentiel. Cette méthode d'accès aux données stockées sur un disque dur est la plus performante que je connaisse, le gain de temps obtenu est de l'ordre de trois et n'est pas sensible à la taille du fichier traités (problématique du swap en cas de chargement en mémoire). Il restait à résoudre la problématique de la portabilité de mon code source, je n'eu pas loin à chercher car dans la partie iostreams des librairie boost se trouve une libairie d'abstraction prête à l'emploit (http://www.boost.org/libs/iostreams/doc/index.html). to:
Dans le cadre de mon projet, l'objectif était de traiter plus de un giga octets de logs dans des temps très courts. Je décide d'implémenter la technique des memoryMappedFile. Cette technique d'accès aux fichiers est très performante, le principe est de mapper, par des appels à l'API système, la zone de données de l'application directement sur le disque dur de la même façon que le fait Windows avec sa mémoire virtuelle (swap disk). Bien que le disque soit d'une lenteur incomparable à celle de la mémoire vide, le gain de temps se fait sur l'allocation mémoire et le chargement des données ce qui donne des performances excellentes, le gain de temps obtenu est de l'ordre de trois et n'est pas sensible à la taille du fichier traité (problématique du swap en cas de chargement en mémoire). Changed lines 6-7 from:
POur vous donner une meileur idée des performances du couple mmap/regex, vous trouverez ci-dessous un court exemple : to:
Pour vous donner une meilleur idée des performances du couple mmap/regex, vous trouverez ci-dessous un court exemple : Changed lines 1-5 from:
Le moteur d'expressions régulières de Boost est très performant et de plus compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix fût arrêté. Voici un court exemple, vous permettant de faire une évaluation de la performance de cette méthode : to:
Le moteur d'expressions régulières de Boost est très performant et de plus compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix d'utiliser cette librairie fût arrêté. POur vous donner une meileur idée des performances du couple mmap/regex, vous trouverez ci-dessous un court exemple : Deleted lines 35-37:
const char* REG_DATE=":digit:?{4}-:digit:?{2}-:digit:?{2}"; const char* REG_IP =":digit:?{2}::digit:?{2}::digit:?{2}):space:?(:digit:?{1,3}\\.:digit:?{1,3}\\.:digit:?{1,3}\\.:digit:?{1,3}"; Deleted line 67:
map_type class_index; Changed line 1 from:
Le moteur d'expression régulières de Boost est très performant et de plus compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix fût arrêté.\\ to:
Le moteur d'expressions régulières de Boost est très performant et de plus compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix fût arrêté.\\ Changed lines 1-3 from:
Le moteur d'expression régulières de Boost est très performant et de plus compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix fût arrêté. Dans le cadre de mon projet, mon objectif était de traiter des fichiers de logs plus de un giga octets, j'ai cherché une libairie d'abstraction me permettant d'utiliser des Memory Mapped File. to:
Le moteur d'expression régulières de Boost est très performant et de plus compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix fût arrêté. Changed lines 161-162 from:
Sur un fichier de 70Mo, le temps de traitement ne dépasse pas 12 secondes sous Windows (à la permière exécution, car un cache accélere grandement les choses par la suite) et atteint 30 secondes par la méthode classique. Sous AIX, le rapport reste identique et je n'ai pas observé de variations entre deux exécution. A noter, que bien que la machine AIX utilisée pour mes tests date d'environ six ans, les temps de traitement mesurés étaient deux fois supérieurs à ceux obtenus sous Windows ce qui semble montrer l'extrême importance des performances disque (une baie de stockage pour AIX et un disque IDE pour Windows). to:
Sur un fichier de 70Mo, sous Windows, le temps de traitement ne dépasse pas 12 secondes (à la permière exécution, car un cache accélere grandement les choses par la suite) et atteint 30 secondes par la méthode classique. Sous AIX, le rapport entre les deux méthodes est le même et je n'ai pas observé de variation entre deux exécutions. A noter, que bien que la machine AIX utilisée pour mes tests date d'environ six ans, les temps de traitement mesurés étaient deux fois supérieurs à ceux obtenus sous Windows ce qui semble montrer l'extrême importance des performances des disques (une baie de stockage pour AIX et un disque IDE pour Windows). Changed line 1 from:
le moteur d'expression régulières de Boost est très performant et compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix fût arrêté. Dans le cadre de mon projet, mon objectif était de traiter des fichiers de logs plus de un giga octets, j'ai cherché une libairie d'abstraction me permettant d'utiliser des Memory Mapped File.\\ to:
Le moteur d'expression régulières de Boost est très performant et de plus compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix fût arrêté. Dans le cadre de mon projet, mon objectif était de traiter des fichiers de logs plus de un giga octets, j'ai cherché une libairie d'abstraction me permettant d'utiliser des Memory Mapped File.\\ Changed lines 4-5 from:
Voici un cours exemple, vous permettant de faire une évaluation de la performance du résultat: to:
Voici un court exemple, vous permettant de faire une évaluation de la performance de cette méthode : Changed lines 157-162 from:
(:sourcend:) to:
(:sourcend:) Le traitement effectué est l'analyse d'une log IIS par une expression régulière particulièrement longue. Added lines 1-157:
le moteur d'expression régulières de Boost est très performant et compilable sous différentes plateformes (dans mon cas AIX et Windows). Après quelques tests de validation, les performances étant au rendez-vous le choix fût arrêté. Dans le cadre de mon projet, mon objectif était de traiter des fichiers de logs plus de un giga octets, j'ai cherché une libairie d'abstraction me permettant d'utiliser des Memory Mapped File. Voici un cours exemple, vous permettant de faire une évaluation de la performance du résultat: (:source lang=C++:)
using namespace std; using namespace boost; using namespace boost::iostreams; // Sous Unix, configurer boost par // cd <boost-root>/libs/config/ // sh ./configure // // pour la compilation : // gcc mapfile.cpp -pedantic -O2 -L /usr/local/lib/ -I /usr/local/include -I ./ -I ../boost_1_33_1/ -o mapfile // /usr/local/bin/g++ -o mapfile mapfile.cpp ../boost_1_33_1/libs/iostreams/src/mapped_file.cpp -pedantic -O2 -L /usr/local/lib/ -I /usr/local/include -I ./ -I ../boost_1_33_1/ typedef std::map<std::string, std::string::difference_type, std::less<std::string> > map_type; const char* REG_DATE=":digit:?{4}-:digit:?{2}-:digit:?{2}"; const char* REG_IP =":digit:?{2}::digit:?{2}::digit:?{2}):space:?(:digit:?{1,3}\\.:digit:?{1,3}\\.:digit:?{1,3}\\.:digit:?{1,3}";
const char* re = REG_DATE ":space:?" REG_TIME ":space:?" REG_CIP ":space:?" REG_USER ":space:?" REG_SITENAME ":space:?" REG_SCOMPUTERNAME ":space:?" REG_SIP ":space:?" REG_SPORT ":space:?" REG_METHOD ":space:?" REG_URI ":space:?" REG_REQ ":space:?" REG_STATUS ":space:?" REG_WIN32STATUS ":space:?" REG_SCBYTES ":space:?" REG_CSBYTES ":space:?" REG_DURATION ":space:?" REG_HTTP ":space:?" REG_HOST ":space:?" REG_USERAGNT ":space:?" REG_COOKIE ":space:?" REG_REFERER ; map_type class_index; int i=0; bool regex_callback(const boost::match_results<std::string::const_iterator>& what) { //printf("\r\n\r\n%i\r\n%s\r\n",i,what[0].str()); i++; return true; } int main(int argc, char* argv[]) { try { boost::regex expression(re); timer a; cout << "opening " << argv[1] << endl; a.restart(); mapped_file_source mapfile; cout << "mapped file method" << endl; mapfile.open(argv[1]); boost::sregex_iterator m1(mapfile.data(), mapfile.data() + mapfile.size(), expression); boost::sregex_iterator m2; std::for_each(m1, m2, ®ex_callback); cout << i <<endl; mapfile.close(); printf("elapse time : %5.3f seconds\n\r",a.elapsed()); cout << "\n\rfileopen method" << endl; i=0; a.restart(); ifstream file; file.open(argv[1],ios_base::in | ios_base::binary ); std::string text; text.erase(); text.reserve(file.rdbuf()->in_avail()); { char c; while(file.get(c)) { if(text.capacity() == text.size()) text.reserve(text.capacity() * 3); text.append(1, c); } } boost::sregex_iterator m3(text.begin(), text.end(), expression); boost::sregex_iterator m4; std::for_each(m3, m4, ®ex_callback); cout << i <<endl; file.close(); printf("elapse time : %5.3f seconds\n\r",a.elapsed()); } catch ( std::ios::failure &fail ){ cout << "Caught an exception: " << fail.what () << endl; } return 0; } (:sourcend:) |