diff --git a/projet/resources/measures/faogeneve-1m1c-2.csv b/projet/resources/measures/faogeneve-1m1c-2.csv new file mode 100644 index 0000000000000000000000000000000000000000..0e6674ce5de058430729a00462534e262f2ec655 --- /dev/null +++ b/projet/resources/measures/faogeneve-1m1c-2.csv @@ -0,0 +1,535 @@ +0,0 +1,0 +2,0 +3,0 +4,4 +5,9 +6,10 +7,10 +8,10 +9,11 +10,16 +11,20 +12,20 +13,20 +14,20 +15,21 +16,24 +17,26 +18,30 +19,30 +20,30 +21,30 +22,31 +23,33 +24,38 +25,40 +26,40 +27,40 +28,40 +29,45 +30,50 +31,50 +32,50 +33,52 +34,60 +35,60 +36,60 +37,60 +38,61 +39,70 +40,70 +41,70 +42,71 +43,71 +44,72 +45,80 +46,80 +47,80 +48,81 +49,83 +50,90 +51,90 +52,90 +53,90 +54,91 +55,96 +56,100 +57,100 +58,100 +59,101 +60,105 +61,110 +62,110 +63,110 +64,111 +65,111 +66,116 +67,120 +68,120 +69,120 +70,120 +71,127 +72,130 +73,130 +74,130 +75,130 +76,131 +77,139 +78,140 +79,140 +80,140 +81,143 +82,149 +83,150 +84,150 +85,150 +86,151 +87,154 +88,160 +89,160 +90,160 +91,161 +92,166 +93,170 +94,170 +95,170 +96,170 +97,173 +98,180 +99,180 +100,180 +101,181 +102,185 +103,190 +104,190 +105,190 +106,191 +107,200 +108,200 +109,200 +110,200 +111,203 +112,207 +113,210 +114,210 +115,210 +116,211 +117,220 +118,220 +119,220 +120,220 +121,221 +122,224 +123,230 +124,230 +125,230 +126,230 +127,231 +128,240 +129,240 +130,240 +131,240 +132,241 +133,243 +134,250 +135,250 +136,250 +137,250 +138,259 +139,260 +140,260 +141,260 +142,261 +143,270 +144,270 +145,270 +146,270 +147,271 +148,272 +149,280 +150,280 +151,280 +152,280 +153,281 +154,287 +155,290 +156,290 +157,290 +158,291 +159,292 +160,300 +161,300 +162,300 +163,300 +164,302 +165,310 +166,310 +167,310 +168,310 +169,311 +170,319 +171,320 +172,320 +173,320 +174,321 +175,330 +176,330 +177,330 +178,330 +179,334 +180,340 +181,340 +182,340 +183,341 +184,349 +185,350 +186,350 +187,350 +188,351 +189,357 +190,360 +191,360 +192,360 +193,361 +194,364 +195,370 +196,370 +197,370 +198,371 +199,374 +200,380 +201,380 +202,380 +203,381 +204,389 +205,390 +206,390 +207,390 +208,391 +209,400 +210,400 +211,400 +212,400 +213,401 +214,410 +215,410 +216,410 +217,410 +218,413 +219,420 +220,420 +221,420 +222,421 +223,427 +224,430 +225,430 +226,430 +227,430 +228,431 +229,431 +230,440 +231,440 +232,440 +233,440 +234,442 +235,449 +236,450 +237,450 +238,450 +239,451 +240,457 +241,459 +242,460 +243,460 +244,460 +245,460 +246,468 +247,470 +248,470 +249,470 +250,471 +251,477 +252,480 +253,480 +254,480 +255,480 +256,481 +257,488 +258,490 +259,490 +260,490 +261,491 +262,500 +263,500 +264,500 +265,500 +266,502 +267,509 +268,510 +269,510 +270,510 +271,511 +272,519 +273,520 +274,520 +275,520 +276,521 +277,530 +278,530 +279,530 +280,530 +281,531 +282,534 +283,539 +284,540 +285,540 +286,540 +287,540 +288,542 +289,548 +290,550 +291,550 +292,550 +293,551 +294,559 +295,560 +296,560 +297,560 +298,561 +299,570 +300,570 +301,570 +302,570 +303,574 +304,576 +305,580 +306,580 +307,580 +308,580 +309,583 +310,588 +311,590 +312,590 +313,590 +314,591 +315,598 +316,600 +317,600 +318,600 +319,601 +320,609 +321,610 +322,610 +323,610 +324,611 +325,620 +326,620 +327,620 +328,620 +329,624 +330,630 +331,630 +332,630 +333,630 +334,634 +335,640 +336,640 +337,640 +338,640 +339,641 +340,650 +341,650 +342,650 +343,650 +344,652 +345,660 +346,660 +347,660 +348,660 +349,660 +350,660 +351,663 +352,664 +353,670 +354,670 +355,670 +356,670 +357,676 +358,680 +359,680 +360,680 +361,680 +362,686 +363,690 +364,690 +365,690 +366,690 +367,690 +368,690 +369,690 +370,690 +371,690 +372,700 +373,700 +374,700 +375,702 +376,707 +377,710 +378,710 +379,710 +380,710 +381,714 +382,720 +383,720 +384,720 +385,720 +386,722 +387,730 +388,730 +389,730 +390,730 +391,731 +392,735 +393,740 +394,740 +395,740 +396,741 +397,742 +398,750 +399,750 +400,750 +401,750 +402,751 +403,755 +404,760 +405,760 +406,760 +407,760 +408,761 +409,770 +410,770 +411,770 +412,770 +413,771 +414,780 +415,780 +416,780 +417,780 +418,781 +419,787 +420,790 +421,790 +422,790 +423,790 +424,794 +425,800 +426,800 +427,800 +428,800 +429,801 +430,801 +431,810 +432,810 +433,810 +434,810 +435,811 +436,819 +437,820 +438,820 +439,820 +440,821 +441,830 +442,830 +443,830 +444,830 +445,831 +446,831 +447,837 +448,840 +449,840 +450,840 +451,841 +452,849 +453,850 +454,850 +455,850 +456,853 +457,860 +458,860 +459,860 +460,860 +461,860 +462,861 +463,867 +464,870 +465,870 +466,870 +467,871 +468,877 +469,879 +470,879 +471,880 +472,880 +473,880 +474,880 +475,881 +476,890 +477,890 +478,890 +479,890 +480,891 +481,896 +482,900 +483,900 +484,900 +485,901 +486,909 +487,910 +488,910 +489,910 +490,911 +491,920 +492,920 +493,920 +494,920 +495,921 +496,929 +497,930 +498,930 +499,930 +500,931 +501,940 +502,940 +503,940 +504,940 +505,941 +506,946 +507,950 +508,950 +509,950 +510,950 +511,954 +512,960 +513,960 +514,960 +515,960 +516,961 +517,962 +518,970 +519,970 +520,970 +521,970 +522,971 +523,980 +524,980 +525,980 +526,980 +527,982 +528,990 +529,990 +530,990 +531,990 +532,990 +533,992 +534,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-1m1c-3.csv b/projet/resources/measures/faogeneve-1m1c-3.csv new file mode 100644 index 0000000000000000000000000000000000000000..bccd0e4def0c00ddfcf8a7dd6b4776f9ca22077a --- /dev/null +++ b/projet/resources/measures/faogeneve-1m1c-3.csv @@ -0,0 +1,497 @@ +0,0 +1,0 +2,0 +3,0 +4,6 +5,10 +6,10 +7,10 +8,10 +9,11 +10,20 +11,20 +12,20 +13,20 +14,29 +15,30 +16,30 +17,30 +18,31 +19,40 +20,40 +21,40 +22,41 +23,50 +24,50 +25,50 +26,51 +27,60 +28,60 +29,60 +30,61 +31,68 +32,70 +33,70 +34,70 +35,74 +36,80 +37,80 +38,80 +39,80 +40,80 +41,81 +42,90 +43,90 +44,90 +45,90 +46,90 +47,91 +48,93 +49,100 +50,100 +51,100 +52,100 +53,100 +54,102 +55,110 +56,110 +57,110 +58,110 +59,117 +60,120 +61,120 +62,120 +63,121 +64,130 +65,130 +66,130 +67,130 +68,131 +69,140 +70,140 +71,140 +72,140 +73,147 +74,150 +75,150 +76,150 +77,151 +78,155 +79,160 +80,160 +81,160 +82,161 +83,170 +84,170 +85,170 +86,171 +87,180 +88,180 +89,180 +90,180 +91,181 +92,190 +93,190 +94,190 +95,191 +96,199 +97,200 +98,200 +99,200 +100,201 +101,210 +102,210 +103,210 +104,210 +105,219 +106,220 +107,220 +108,220 +109,221 +110,230 +111,230 +112,230 +113,231 +114,240 +115,240 +116,240 +117,240 +118,243 +119,250 +120,250 +121,250 +122,251 +123,260 +124,260 +125,260 +126,260 +127,261 +128,270 +129,270 +130,270 +131,270 +132,278 +133,280 +134,280 +135,280 +136,281 +137,289 +138,290 +139,290 +140,290 +141,290 +142,290 +143,291 +144,300 +145,300 +146,300 +147,300 +148,302 +149,310 +150,310 +151,310 +152,310 +153,320 +154,320 +155,320 +156,320 +157,321 +158,330 +159,330 +160,330 +161,330 +162,333 +163,340 +164,340 +165,340 +166,341 +167,345 +168,350 +169,350 +170,350 +171,350 +172,358 +173,360 +174,360 +175,360 +176,363 +177,370 +178,370 +179,370 +180,370 +181,374 +182,380 +183,380 +184,380 +185,380 +186,381 +187,390 +188,390 +189,390 +190,390 +191,391 +192,400 +193,400 +194,400 +195,400 +196,402 +197,410 +198,410 +199,410 +200,410 +201,411 +202,419 +203,420 +204,420 +205,420 +206,421 +207,427 +208,430 +209,430 +210,430 +211,430 +212,431 +213,440 +214,440 +215,440 +216,440 +217,446 +218,450 +219,450 +220,450 +221,451 +222,460 +223,460 +224,460 +225,460 +226,461 +227,470 +228,470 +229,470 +230,470 +231,472 +232,480 +233,480 +234,480 +235,480 +236,481 +237,490 +238,490 +239,490 +240,490 +241,491 +242,500 +243,500 +244,500 +245,500 +246,501 +247,510 +248,510 +249,510 +250,510 +251,511 +252,520 +253,520 +254,520 +255,520 +256,521 +257,530 +258,530 +259,530 +260,530 +261,531 +262,540 +263,540 +264,540 +265,542 +266,547 +267,550 +268,550 +269,550 +270,551 +271,560 +272,560 +273,560 +274,560 +275,561 +276,570 +277,570 +278,570 +279,570 +280,571 +281,580 +282,580 +283,580 +284,580 +285,581 +286,589 +287,590 +288,590 +289,590 +290,591 +291,600 +292,600 +293,600 +294,600 +295,601 +296,610 +297,610 +298,610 +299,610 +300,611 +301,620 +302,620 +303,620 +304,621 +305,624 +306,630 +307,630 +308,630 +309,631 +310,640 +311,640 +312,640 +313,640 +314,649 +315,650 +316,650 +317,650 +318,652 +319,660 +320,660 +321,660 +322,662 +323,670 +324,670 +325,670 +326,670 +327,672 +328,680 +329,680 +330,680 +331,680 +332,685 +333,690 +334,690 +335,690 +336,698 +337,700 +338,700 +339,700 +340,703 +341,707 +342,710 +343,710 +344,710 +345,711 +346,720 +347,720 +348,720 +349,720 +350,726 +351,730 +352,730 +353,730 +354,731 +355,739 +356,740 +357,740 +358,740 +359,741 +360,750 +361,750 +362,750 +363,750 +364,751 +365,753 +366,760 +367,760 +368,760 +369,760 +370,762 +371,770 +372,770 +373,770 +374,771 +375,780 +376,780 +377,780 +378,780 +379,781 +380,784 +381,790 +382,790 +383,790 +384,790 +385,791 +386,793 +387,800 +388,800 +389,800 +390,801 +391,810 +392,810 +393,810 +394,810 +395,816 +396,820 +397,820 +398,820 +399,820 +400,829 +401,830 +402,830 +403,830 +404,832 +405,836 +406,840 +407,840 +408,840 +409,840 +410,841 +411,850 +412,850 +413,850 +414,850 +415,852 +416,859 +417,860 +418,860 +419,860 +420,861 +421,869 +422,870 +423,870 +424,870 +425,871 +426,880 +427,880 +428,880 +429,880 +430,881 +431,890 +432,890 +433,890 +434,890 +435,897 +436,900 +437,900 +438,900 +439,900 +440,901 +441,902 +442,910 +443,910 +444,910 +445,910 +446,911 +447,911 +448,914 +449,920 +450,920 +451,920 +452,920 +453,924 +454,930 +455,930 +456,930 +457,930 +458,932 +459,940 +460,940 +461,940 +462,940 +463,942 +464,943 +465,950 +466,950 +467,950 +468,950 +469,951 +470,952 +471,954 +472,960 +473,960 +474,960 +475,960 +476,961 +477,965 +478,970 +479,970 +480,970 +481,970 +482,971 +483,978 +484,980 +485,980 +486,980 +487,980 +488,982 +489,990 +490,990 +491,990 +492,990 +493,990 +494,991 +495,992 +496,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-1m1c-4.csv b/projet/resources/measures/faogeneve-1m1c-4.csv new file mode 100644 index 0000000000000000000000000000000000000000..d71afaae6f2cda0e84347f2b192aa7a527e29813 --- /dev/null +++ b/projet/resources/measures/faogeneve-1m1c-4.csv @@ -0,0 +1,369 @@ +0,0 +1,0 +2,0 +3,0 +4,10 +5,10 +6,10 +7,12 +8,20 +9,20 +10,20 +11,26 +12,30 +13,30 +14,30 +15,38 +16,40 +17,40 +18,40 +19,50 +20,50 +21,50 +22,50 +23,59 +24,60 +25,60 +26,60 +27,70 +28,70 +29,70 +30,70 +31,80 +32,80 +33,80 +34,81 +35,90 +36,90 +37,90 +38,90 +39,100 +40,100 +41,100 +42,102 +43,110 +44,110 +45,110 +46,120 +47,120 +48,120 +49,120 +50,130 +51,130 +52,130 +53,131 +54,140 +55,140 +56,140 +57,140 +58,150 +59,150 +60,150 +61,150 +62,160 +63,160 +64,160 +65,160 +66,170 +67,170 +68,170 +69,171 +70,180 +71,180 +72,180 +73,190 +74,190 +75,190 +76,193 +77,200 +78,200 +79,200 +80,210 +81,210 +82,210 +83,210 +84,215 +85,220 +86,220 +87,220 +88,229 +89,230 +90,230 +91,230 +92,240 +93,240 +94,240 +95,248 +96,250 +97,250 +98,251 +99,260 +100,260 +101,260 +102,270 +103,270 +104,270 +105,270 +106,280 +107,280 +108,280 +109,288 +110,290 +111,290 +112,290 +113,300 +114,300 +115,300 +116,302 +117,310 +118,310 +119,310 +120,320 +121,320 +122,321 +123,321 +124,331 +125,332 +126,332 +127,340 +128,342 +129,342 +130,342 +131,352 +132,352 +133,352 +134,354 +135,362 +136,362 +137,362 +138,362 +139,362 +140,368 +141,372 +142,372 +143,372 +144,372 +145,372 +146,378 +147,382 +148,382 +149,382 +150,392 +151,392 +152,392 +153,393 +154,402 +155,402 +156,402 +157,412 +158,412 +159,412 +160,422 +161,422 +162,422 +163,425 +164,432 +165,432 +166,432 +167,442 +168,442 +169,442 +170,451 +171,452 +172,452 +173,452 +174,462 +175,462 +176,462 +177,472 +178,472 +179,472 +180,472 +181,482 +182,482 +183,482 +184,482 +185,492 +186,492 +187,492 +188,493 +189,502 +190,502 +191,502 +192,511 +193,512 +194,512 +195,512 +196,522 +197,522 +198,522 +199,532 +200,532 +201,532 +202,532 +203,540 +204,542 +205,542 +206,542 +207,542 +208,552 +209,552 +210,552 +211,553 +212,562 +213,562 +214,562 +215,572 +216,572 +217,572 +218,581 +219,582 +220,582 +221,582 +222,592 +223,592 +224,592 +225,601 +226,602 +227,602 +228,602 +229,612 +230,612 +231,612 +232,612 +233,622 +234,622 +235,622 +236,629 +237,632 +238,632 +239,632 +240,642 +241,642 +242,642 +243,652 +244,652 +245,652 +246,661 +247,662 +248,662 +249,662 +250,672 +251,672 +252,672 +253,673 +254,682 +255,682 +256,682 +257,692 +258,692 +259,692 +260,701 +261,702 +262,702 +263,712 +264,712 +265,712 +266,712 +267,722 +268,722 +269,722 +270,732 +271,732 +272,732 +273,738 +274,742 +275,742 +276,742 +277,752 +278,752 +279,752 +280,752 +281,762 +282,762 +283,762 +284,772 +285,772 +286,772 +287,781 +288,782 +289,782 +290,782 +291,792 +292,792 +293,792 +294,795 +295,802 +296,802 +297,802 +298,803 +299,812 +300,812 +301,812 +302,812 +303,820 +304,820 +305,820 +306,827 +307,829 +308,830 +309,830 +310,830 +311,838 +312,840 +313,840 +314,840 +315,850 +316,850 +317,850 +318,853 +319,860 +320,860 +321,860 +322,870 +323,870 +324,870 +325,880 +326,880 +327,880 +328,886 +329,890 +330,890 +331,890 +332,900 +333,900 +334,900 +335,900 +336,910 +337,910 +338,910 +339,920 +340,920 +341,920 +342,924 +343,930 +344,930 +345,930 +346,939 +347,940 +348,940 +349,940 +350,950 +351,950 +352,950 +353,956 +354,960 +355,960 +356,960 +357,970 +358,970 +359,970 +360,970 +361,980 +362,980 +363,980 +364,988 +365,990 +366,990 +367,990 +368,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-1m6c-2.csv b/projet/resources/measures/faogeneve-1m6c-2.csv new file mode 100644 index 0000000000000000000000000000000000000000..5c640f186ba6385707a5ccba0240f7801cc6e7fe --- /dev/null +++ b/projet/resources/measures/faogeneve-1m6c-2.csv @@ -0,0 +1,182 @@ +0,0 +1,0 +2,0 +3,0 +4,2 +5,7 +6,15 +7,25 +8,34 +9,44 +10,44 +11,44 +12,60 +13,60 +14,61 +15,70 +16,84 +17,87 +18,94 +19,102 +20,110 +21,120 +22,120 +23,122 +24,127 +25,140 +26,145 +27,150 +28,153 +29,153 +30,160 +31,172 +32,180 +33,181 +34,185 +35,193 +36,208 +37,211 +38,214 +39,223 +40,240 +41,240 +42,245 +43,248 +44,263 +45,276 +46,281 +47,295 +48,300 +49,300 +50,305 +51,308 +52,317 +53,319 +54,328 +55,332 +56,351 +57,359 +58,360 +59,360 +60,361 +61,370 +62,372 +63,374 +64,378 +65,378 +66,388 +67,402 +68,416 +69,418 +70,427 +71,430 +72,430 +73,431 +74,438 +75,438 +76,444 +77,444 +78,452 +79,456 +80,475 +81,483 +82,490 +83,490 +84,491 +85,500 +86,502 +87,503 +88,505 +89,515 +90,523 +91,539 +92,546 +93,557 +94,560 +95,560 +96,561 +97,563 +98,563 +99,564 +100,567 +101,580 +102,583 +103,604 +104,611 +105,620 +106,620 +107,620 +108,621 +109,621 +110,621 +111,623 +112,623 +113,623 +114,623 +115,625 +116,629 +117,657 +118,666 +119,678 +120,680 +121,681 +122,689 +123,693 +124,695 +125,697 +126,702 +127,704 +128,718 +129,731 +130,738 +131,744 +132,749 +133,754 +134,761 +135,770 +136,774 +137,784 +138,789 +139,795 +140,801 +141,810 +142,819 +143,827 +144,831 +145,835 +146,851 +147,857 +148,861 +149,869 +150,871 +151,873 +152,883 +153,892 +154,892 +155,903 +156,910 +157,911 +158,920 +159,920 +160,921 +161,924 +162,936 +163,940 +164,940 +165,940 +166,940 +167,942 +168,950 +169,960 +170,960 +171,960 +172,960 +173,962 +174,969 +175,980 +176,980 +177,980 +178,980 +179,982 +180,988 +181,1000 diff --git a/projet/resources/measures/faogeneve-1m6c-3.csv b/projet/resources/measures/faogeneve-1m6c-3.csv new file mode 100644 index 0000000000000000000000000000000000000000..bb71a9a422e4e007b89faac4257614e1837f6d53 --- /dev/null +++ b/projet/resources/measures/faogeneve-1m6c-3.csv @@ -0,0 +1,213 @@ +0,0 +1,0 +2,0 +3,0 +4,1 +5,4 +6,5 +7,10 +8,17 +9,20 +10,25 +11,27 +12,28 +13,36 +14,38 +15,48 +16,56 +17,60 +18,60 +19,60 +20,60 +21,60 +22,61 +23,62 +24,62 +25,65 +26,65 +27,65 +28,65 +29,65 +30,67 +31,69 +32,81 +33,97 +34,103 +35,118 +36,120 +37,120 +38,120 +39,121 +40,125 +41,128 +42,129 +43,129 +44,141 +45,166 +46,168 +47,173 +48,180 +49,180 +50,181 +51,186 +52,196 +53,199 +54,202 +55,204 +56,204 +57,207 +58,226 +59,233 +60,241 +61,246 +62,257 +63,260 +64,260 +65,263 +66,263 +67,267 +68,270 +69,283 +70,287 +71,296 +72,304 +73,317 +74,320 +75,320 +76,329 +77,332 +78,338 +79,342 +80,343 +81,346 +82,357 +83,370 +84,376 +85,378 +86,390 +87,390 +88,392 +89,398 +90,400 +91,406 +92,414 +93,419 +94,420 +95,421 +96,423 +97,433 +98,451 +99,460 +100,460 +101,461 +102,465 +103,467 +104,467 +105,470 +106,471 +107,483 +108,500 +109,511 +110,518 +111,520 +112,520 +113,521 +114,527 +115,532 +116,533 +117,533 +118,543 +119,551 +120,559 +121,575 +122,580 +123,580 +124,580 +125,580 +126,586 +127,592 +128,592 +129,593 +130,596 +131,617 +132,632 +133,640 +134,642 +135,648 +136,650 +137,650 +138,651 +139,653 +140,653 +141,657 +142,661 +143,673 +144,681 +145,699 +146,710 +147,710 +148,710 +149,711 +150,719 +151,720 +152,723 +153,724 +154,735 +155,740 +156,745 +157,752 +158,758 +159,767 +160,769 +161,779 +162,781 +163,785 +164,789 +165,789 +166,792 +167,804 +168,815 +169,818 +170,819 +171,822 +172,835 +173,840 +174,842 +175,849 +176,859 +177,869 +178,871 +179,878 +180,882 +181,890 +182,900 +183,901 +184,903 +185,910 +186,915 +187,921 +188,936 +189,940 +190,940 +191,940 +192,940 +193,940 +194,942 +195,943 +196,954 +197,960 +198,960 +199,960 +200,962 +201,962 +202,967 +203,979 +204,980 +205,980 +206,980 +207,980 +208,981 +209,982 +210,987 +211,990 +212,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-1m6c-4.csv b/projet/resources/measures/faogeneve-1m6c-4.csv new file mode 100644 index 0000000000000000000000000000000000000000..ae547bb5df1e2e2999d2ba536633df6788f1f45f --- /dev/null +++ b/projet/resources/measures/faogeneve-1m6c-4.csv @@ -0,0 +1,259 @@ +0,0 +1,0 +2,0 +3,0 +4,1 +5,2 +6,5 +7,6 +8,7 +9,10 +10,16 +11,22 +12,24 +13,28 +14,47 +15,53 +16,60 +17,60 +18,60 +19,61 +20,62 +21,63 +22,68 +23,69 +24,69 +25,70 +26,71 +27,73 +28,75 +29,75 +30,75 +31,88 +32,106 +33,107 +34,111 +35,115 +36,117 +37,121 +38,122 +39,130 +40,130 +41,131 +42,139 +43,139 +44,139 +45,140 +46,151 +47,158 +48,169 +49,173 +50,182 +51,188 +52,190 +53,190 +54,193 +55,200 +56,200 +57,200 +58,201 +59,201 +60,201 +61,201 +62,201 +63,202 +64,207 +65,224 +66,230 +67,240 +68,243 +69,251 +70,260 +71,260 +72,260 +73,260 +74,260 +75,262 +76,263 +77,265 +78,265 +79,265 +80,265 +81,266 +82,266 +83,272 +84,279 +85,294 +86,300 +87,309 +88,316 +89,320 +90,320 +91,322 +92,323 +93,325 +94,329 +95,330 +96,330 +97,330 +98,330 +99,330 +100,356 +101,367 +102,380 +103,380 +104,380 +105,380 +106,381 +107,381 +108,382 +109,382 +110,389 +111,390 +112,395 +113,398 +114,407 +115,412 +116,420 +117,423 +118,427 +119,431 +120,433 +121,435 +122,439 +123,441 +124,441 +125,444 +126,447 +127,450 +128,450 +129,450 +130,452 +131,452 +132,454 +133,454 +134,455 +135,457 +136,468 +137,474 +138,479 +139,483 +140,491 +141,493 +142,495 +143,499 +144,510 +145,510 +146,510 +147,510 +148,512 +149,513 +150,516 +151,519 +152,519 +153,520 +154,520 +155,521 +156,522 +157,523 +158,523 +159,524 +160,559 +161,565 +162,570 +163,572 +164,580 +165,580 +166,580 +167,586 +168,588 +169,588 +170,589 +171,589 +172,589 +173,598 +174,602 +175,608 +176,616 +177,626 +178,637 +179,640 +180,640 +181,642 +182,648 +183,650 +184,652 +185,664 +186,668 +187,674 +188,685 +189,693 +190,699 +191,700 +192,703 +193,711 +194,711 +195,720 +196,720 +197,720 +198,724 +199,727 +200,741 +201,745 +202,752 +203,764 +204,768 +205,772 +206,778 +207,780 +208,781 +209,783 +210,784 +211,791 +212,796 +213,804 +214,813 +215,815 +216,818 +217,825 +218,840 +219,841 +220,849 +221,855 +222,860 +223,861 +224,862 +225,862 +226,864 +227,864 +228,875 +229,885 +230,892 +231,899 +232,905 +233,910 +234,910 +235,912 +236,919 +237,920 +238,920 +239,936 +240,940 +241,940 +242,940 +243,941 +244,950 +245,951 +246,960 +247,960 +248,961 +249,964 +250,970 +251,980 +252,980 +253,980 +254,980 +255,982 +256,983 +257,987 +258,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-2m6c-1.csv b/projet/resources/measures/faogeneve-2m6c-1.csv new file mode 100644 index 0000000000000000000000000000000000000000..46d3e59256c3568a2e42f361da3262725a605409 --- /dev/null +++ b/projet/resources/measures/faogeneve-2m6c-1.csv @@ -0,0 +1,72 @@ +0,0 +1,0 +2,60 +3,100 +4,120 +5,166 +6,213 +7,213 +8,214 +9,233 +10,233 +11,260 +12,294 +13,314 +14,462 +15,469 +16,476 +17,481 +18,505 +19,536 +20,590 +21,602 +22,620 +23,620 +24,623 +25,624 +26,624 +27,624 +28,631 +29,650 +30,661 +31,661 +32,680 +33,681 +34,683 +35,691 +36,695 +37,701 +38,701 +39,727 +40,737 +41,740 +42,742 +43,751 +44,751 +45,773 +46,773 +47,793 +48,799 +49,811 +50,811 +51,826 +52,826 +53,845 +54,845 +55,862 +56,876 +57,880 +58,888 +59,888 +60,899 +61,920 +62,928 +63,930 +64,930 +65,951 +66,960 +67,960 +68,977 +69,983 +70,997 +71,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-2m6c-2.csv b/projet/resources/measures/faogeneve-2m6c-2.csv new file mode 100644 index 0000000000000000000000000000000000000000..a2279826a51dfcf14eeaa025352af9603344ca34 --- /dev/null +++ b/projet/resources/measures/faogeneve-2m6c-2.csv @@ -0,0 +1,47 @@ +0,0 +1,0 +2,0 +3,0 +4,8 +5,40 +6,46 +7,54 +8,68 +9,99 +10,100 +11,110 +12,157 +13,173 +14,207 +15,248 +16,260 +17,268 +18,338 +19,358 +20,360 +21,390 +22,430 +23,460 +24,483 +25,510 +26,517 +27,581 +28,610 +29,611 +30,641 +31,677 +32,718 +33,750 +34,760 +35,773 +36,825 +37,840 +38,861 +39,890 +40,890 +41,912 +42,966 +43,987 +44,990 +45,990 +46,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-2m6c-3.csv b/projet/resources/measures/faogeneve-2m6c-3.csv new file mode 100644 index 0000000000000000000000000000000000000000..2280728a97fcfe6b9fc7c61551fc1b137eaa69dd --- /dev/null +++ b/projet/resources/measures/faogeneve-2m6c-3.csv @@ -0,0 +1,55 @@ +0,0 +1,0 +2,0 +3,1 +4,35 +5,42 +6,46 +7,54 +8,55 +9,72 +10,113 +11,136 +12,140 +13,140 +14,173 +15,198 +16,252 +17,280 +18,280 +19,301 +20,326 +21,366 +22,390 +23,410 +24,419 +25,436 +26,479 +27,520 +28,530 +29,550 +30,560 +31,576 +32,636 +33,660 +34,685 +35,690 +36,716 +37,743 +38,790 +39,799 +40,810 +41,830 +42,840 +43,860 +44,900 +45,910 +46,910 +47,910 +48,918 +49,955 +50,960 +51,960 +52,960 +53,980 +54,1000 \ No newline at end of file diff --git a/projet/resources/measures/faogeneve-2m6c-4.csv b/projet/resources/measures/faogeneve-2m6c-4.csv new file mode 100644 index 0000000000000000000000000000000000000000..d9e9bf52aabacf918edd2e5341d4fa824b4274ab --- /dev/null +++ b/projet/resources/measures/faogeneve-2m6c-4.csv @@ -0,0 +1,53 @@ +0,0 +1,0 +2,0 +3,2 +4,38 +5,44 +6,53 +7,58 +8,76 +9,113 +10,135 +11,149 +12,150 +13,165 +14,210 +15,250 +16,252 +17,280 +18,290 +19,310 +20,384 +21,390 +22,400 +23,429 +24,447 +25,500 +26,530 +27,531 +28,549 +29,572 +30,621 +31,648 +32,663 +33,679 +34,701 +35,703 +36,714 +37,774 +38,801 +39,810 +40,812 +41,851 +42,884 +43,900 +44,910 +45,910 +46,921 +47,956 +48,960 +49,960 +50,970 +51,995 +52,1000 \ No newline at end of file diff --git a/projet/resources/measures/quick-perf.py b/projet/resources/measures/quick-perf.py new file mode 100644 index 0000000000000000000000000000000000000000..57117a51956fc7a2e67680eeb282a013ad693da6 --- /dev/null +++ b/projet/resources/measures/quick-perf.py @@ -0,0 +1,17 @@ +import math + +import matplotlib.pyplot as plt + +if __name__ == '__main__': + + plt.ylabel("Performance") + plt.xlabel("Nombre de coeurs") + plt.plot([1, 6, 12], [1, 2.13, 8.83], label="Fonction de gain de performance", marker='x') + plt.plot(range(1, 13), [k * 2 for k in range(1, 13)], label="2x") + plt.plot(range(1, 13), [math.log(k) for k in range(1, 13)], label="log(x)") + plt.plot(range(1, 13), [k for k in range(1, 13)], label="x") + plt.plot(range(1, 13), [.5*k for k in range(1, 13)], label="0.5x") + plt.plot(range(1, 13), [math.log2(k) for k in range(1, 13)], label="log2(x)") + + plt.legend() + plt.savefig("output.pdf") diff --git a/rapport/config.yaml b/rapport/config.yaml index df9f60d27882bfbcb7af2e802156cd767fcfa731..3dc452c975233c692c99639c7caada5f7bec85c3 100644 --- a/rapport/config.yaml +++ b/rapport/config.yaml @@ -12,7 +12,7 @@ year: 2020 sensei: Dr. Orestis Malaspinas mandator: Aucun frontLogoSourceURL: https://unsplash.com/photos/nE2HV5AUXFo -dedicasse: +dedicasse: "A tous ceux qui m'ont supporté et apporté leur aide : merci." projectTitle: Projet de semestre bibliography: my.bib csl: iso690.csl diff --git a/rapport/text/0-preface.md b/rapport/text/0-preface.md index a33b990627625bc5271c9cba62fb85a21656ab4d..4353d6048de922e311423433deab914162123616 100644 --- a/rapport/text/0-preface.md +++ b/rapport/text/0-preface.md @@ -1,17 +1,18 @@ -# Remerciements {-} +# Remerciements {-} -Je souhaite remercier chaleureusement Monsieur Malaspinas, qui m'a apporté son aide, ses encouragements et ses critiques le long de ce travail. +Je souhaite remercier chaleureusement le Docteur Malaspinas, qui m'a apporté son aide, ses encouragements et ses critiques le long de ce travail. Un grand merci à Monsieur Hoerdt, qui m'a aiguillé sur la technologie sur laquelle se repose ce projet. J'aimerais aussi remercier Monsieur Basilico, qui a permis le déploiement de ce projet sur les machines de l'HEPIA. -Enfin, je souhaite adresser mes remerciements à Monsieur El Kharroubi, qui m'a assisté dans le déploiement des différents outils nécessaires à -ce projet de semestre. +Merci à Monsieur El Kharroubi, qui m'a assisté dans le déploiement des différents outils nécessaires à ce projet de semestre. + +Enfin, je remercie Monsieur Neuenschwander qui a accepté de me relire et de me corriger. # Résumé {-} -Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé Texte de votre résumé +Rester informé sur Internet devient de plus en plus difficile. Ce réseau continue inexorablement à s'étendre et à proposer une foule d'information qui est impossible à absorber par un être humain. Certains sites ont une telle quantité d'information qu'ils représentent à eux seuls une masse beaucoup trop importante pour que quiconque s'affirme à jour. Une solution, qui est le sujet de ce travail de semestre, est le traitement en masse de documents, qu'on surnomme _scraping_. Le but de ce projet est de proposer un logiciel modulaire, nommé NScrap, capable de se connecter à tout site, et utilisable par tous et toutes. Pour atteindre ce but, ce travail propose l'étude et l'implémentation d'un logiciel remplissant ces critères. Pour vérifier si NScrap répond à ces questions, ce travail étudiera les performances de récupération de documents sur deux sites différents. La capacité d'utilisation par un utilisateur lambda sera aussi étudiée. Les résultats en performances semblent indiquer qu'un scrapper peut accélérer au moins de deux fois la récupération de documents. Au maximum, un gain de 883% de vitesse a été observé. L'objectif de gain de performance semble avoir été rempli. L'implémentation d'un système accessible à un utilisateur lambda est encore à améliorer, par exemple en transformant l'implémentation actuelle se reposant sur l'écriture de fichiers de commandes par l'utilisateur en interface web où ce dernier n'aurait plus qu'à relier des boîtes, à la façon d'un flux de travail pour définir le fonctionnement de l'application. Cette amélioration sera apportée lors du travail de Bachelor, qui sera en continuité avec ce travail. \begin{figure} \vspace{.25cm} diff --git a/rapport/text/2-introduction.md b/rapport/text/2-introduction.md index 997420cd44dfb1b29bbdbc039044c228751659ca..4debd9608a14c3526184c8a68a618da3e73d1238 100644 --- a/rapport/text/2-introduction.md +++ b/rapport/text/2-introduction.md @@ -3,7 +3,7 @@ # Introduction {-} Obtenir des informations, que ce soit sur Internet ou dans la vie réelle, devient de plus en plus difficile. Les initiatives de données ouvertes, permettant la récupération simple et rapide de données, ne sont pas nombreuses. Chacun propose à sa façon des informations redondantes, incorrectes, parfois redirigeant sur des organismes ou des sites web n'existant plus. Rester à jour est un effort qui peut s'avérer titanesque. -L'Homme étant enclin à faire des erreurs, une solution humaine ne convient pas; on peut se tourner vers l'informatique pour automatiser l'action répétitive qu'est de récupérer un document, mais il faut un système suffisamment flexible pour pouvoir fonctionner sur n'importe quel site. Un intérêt scientifique et social est présent : d'une part, on peut mesurer l'efficacité d'un tel outil pour voir si oui ou non un tel logiciel peut accélérer la récupération de documents, et d'autre part, on peut trouver des applications pratiques où un individu a besoin de récupérer des informations en masse. De tels logiciels peuvent être utiles pour bien des professions, souvent en dehors de l'informatique : un système utilisable par des utilisateurs lambda serait un énorme plus dans un monde où bien des programmes sont inaccessibles au public du fait de leur complexité. +L'Homme étant enclin à faire des erreurs, une solution humaine ne convient pas; on peut se tourner vers l'informatique pour automatiser l'action répétitive qu'est de récupérer un document, mais il faut un système modulaire, capable de fonctionner sur n'importe quel site. Un intérêt scientifique et social est présent : d'une part, on peut mesurer l'efficacité d'un tel outil pour voir si oui ou non un tel logiciel peut accélérer la récupération de documents, et d'autre part, on peut trouver des applications pratiques où un individu a besoin de récupérer des informations en masse. De tels logiciels peuvent être utiles pour bien des professions, souvent en dehors de l'informatique : un système utilisable par des utilisateurs lambda serait un énorme plus dans un monde où bien des programmes sont inaccessibles au public du fait de leur complexité. L'objectif de ce travail est donc de proposer un logiciel, que l'on nommera NScrap, étant capable de télécharger des données en masse, suffisamment flexible pour qu'il soit compatible avec la très grande majorités des sites web. Il devra proposer d'une façon ou l'autre un système suffisamment simple pour permettre à un utilisateur lambda de s'en servir. Pour faire un tel logiciel, il est nécessaire de s'inspirer des solutions existantes sur Internet aujourd'hui. Une fois ces dernières présentées, il sera question d'implémenter NScrap en se basant sur la liste des technologies des autres logiciels. Une fois le logiciel conçu, il sera question de mesurer son efficacité et de la comparer avec d'autres logiciels du même genre. diff --git a/rapport/text/3-etude.md b/rapport/text/3-etude.md index c2842345cf7d101a13dfa8409e3af7104858dd67..f36f4da0ee166399ae75f415a05327612b45b7f6 100644 --- a/rapport/text/3-etude.md +++ b/rapport/text/3-etude.md @@ -75,7 +75,7 @@ Si toutefois les données que nous souhaitons récupérer sont hébergées sur u L'informatique est un outil extrêmement polyvalent. Il y a un véritable intérêt de comprendre comment un logiciel fonctionne qui dépasse la compréhension du code : une bonne compréhension du code permet aussi d'analyser la moralité de ce dernier. Il peut être facile d'ignorer cette facette, en se justifiant par l'argument que la moralité dans un logiciel de téléchargement de données en masse importe peu. Le marché prouve le contraire; en guise d'exemple, Amazon propose _Mechanical Turk_, un service permettant à tous et à toutes de récupérer -des masses de documents en payant une autre personne pour le faire. Elle sera payée entre 4 et 5 dollars par jour [@semuels_online_nodate] pour des actions répétitives (comme par exemple récupérer des documents en masse). En supposant qu'une journée de travail est composée de 8 heures, que chaque document +des masses de documents en payant une autre personne pour le faire. Elle sera payée entre quatre et cinq dollars par jour [@semuels_online_nodate] pour des actions répétitives (comme par exemple récupérer des documents en masse). En supposant qu'une journée de travail est composée de huit heures, que chaque document prend 30 secondes à télécharger et qu'il y a un nombre de documents suffisant pour au moins une journée, le téléchargement d'un document est payé entre 0.004$ et 0.005$. Avec de telles sommes, une nouvelle catégorie de précarité est ouverte. diff --git a/rapport/text/4-conception.md b/rapport/text/4-conception.md index 4796a0c752e29ca23a124db3e6650a29658a0601..b84500abe71a1f97deeab320cdeb0256f59a85f1 100644 --- a/rapport/text/4-conception.md +++ b/rapport/text/4-conception.md @@ -54,7 +54,7 @@ Enfin, nous nous servirons aussi comme tous les autres logiciels de scraping d'u ### Modèles de données -Différents modèles sont implémentés dans ce projet. Les deux principaux sont les tâches et les modules : un module est en charge d'une action spécifique (les boîtes noires que nous avons cité plus haut). Une tâche, quant à elle, est une instance d'un module. Un module est défini par un numéro d'identification unique, un nom et un fanion déterminant si le module doit effectuer une tâche complexe ou non, et un tableau contenant les arguments attendus pour lancer le module en question. +Différents modèles sont implémentés dans ce projet. Les deux principaux sont les tâches et les modules : un module est en charge d'une action spécifique (les boîtes noires que nous avons cité plus haut). Une tâche, quant à elle, est une instance d'un module. Un module est défini par un numéro d'identification unique, un nom et un fanion déterminant si le module doit effectuer une tâche complexe ou non, et un tableau contenant les arguments attendus pour exécuter le module en question. Les tâches sont définies elles aussi par un numéro d'identification unique, par le numéro unique du module que représente la tâche, les arguments à fournir au module pour fonctionner et le nombre de fois que cette tâche a été effectuée. Chaque tâche est effectuée au moins une fois. Si la tâche est accomplie avec succès à la première exécution, alors la tâche est supprimée, sinon elle est relancée. Elle sera relancée au maximum trois fois, puis mise dans la table des tâches en échec. De cette façon il est possible de déterminer quelle tâche a échoué systématiquement et pourquoi (le dernier message d'erreur est inclus avec la tâche). @@ -70,7 +70,7 @@ et inter-processus. ZeroMQ est particulièrement populaire, propose une impléme Quand la communication avec ZMQ n'est pas souhaitable ou possible, le protocole (+HTTP_a) est utilisé : le panneau de contrôle utilise par exemple exclusivement HTTP. Les scrapers utilisent aussi (+HTTP_a) car il ne leur est pas possible d'utiliser ZMQ. Pour gérer certains évènements générés par les pages web qu'ils visitent, il est nécessaire d'injecter du javascript dans la page web en question. Ainsi, si la page web fonctionne en partie ou totalement avec Javascript, il est possible d'intercepter les évènements signalant qu'une action s'est produite et agir en conséquence. -Utiliser ZMQ dans cette situation aurait été bien plus compliqué qu'utiliser (+HTTP_a). Qui plus est, Javascript permet de lancer des appels HTTP. Il suffit donc de créer un petit serveur web capable de réceptionner les appels HTTP lancés par Javascript. Ainsi, on est tout à fait capable de récupérer les évènements générés par la page web dans notre infrastructure. Un seul serveur web de "surveillance" est démarré par client afin d'éviter de surcharger la machine. +Utiliser ZMQ dans cette situation aurait été bien plus compliqué qu'utiliser (+HTTP_a). Qui plus est, Javascript permet de envoyer des appels HTTP. Il suffit donc de créer un petit serveur web capable de réceptionner les appels HTTP lancés par Javascript. Ainsi, on est tout à fait capable de récupérer les évènements générés par la page web dans notre infrastructure. Un seul serveur web de "surveillance" est démarré par client afin d'éviter de surcharger la machine. \cimg{figs/js-infra.png}{scale=.4}{Gestion des évènements Javascript}{Source : réalisé par Théo Pirkl} @@ -116,7 +116,9 @@ Ce dernier permet le téléchargement très rapide[^14] de documents sur un site La FAO Genève est un excellent exemple de scraper simple. Javascript n'est utilisé qu'à des fins esthétiques. On peut donc utiliser Scrapy pour ce genre de site. L'implémentation avec Scrapy est relativement simple : en une cinquantaine de lignes, on est capable de récupérer les documents du site. Scrapy étant lui-même son framework, aucun module n'est nécessaire. On peut démarrer avec une configuration réduite un scraper rentrant dans la catégorie un , c'est-à-dire démarrer avec un seul client, au vu de la vitesse de traitement. -Les modules présentés ci-dessus sont tout à fait compatibles avec Scrapy, mais ils ne sont pas utilisés au vu de la seule efficacité de ce framework. +Les modules présentés ci-dessus sont tout à fait compatibles avec Scrapy, mais ils ne sont pas utilisés au vu de la seule efficacité de ce framework. + +Dans le cas de la FAO Genève, on ne trie pas les documents, mais on les récupère en bloc. Il est toutefois tout à fait possible de récupérer les documents en les filtrant avant de les récupérer. ## Catégorie deux : Scrapers complexes @@ -133,11 +135,13 @@ L'annexe un donne un exemple de _playbook_ dans lequel on peut voir Swiss Impex - Lire le fichier contenu dans `./resources/EUMerchIDs.txt` (ce fichier contient l'identificateur de chaque catégorie de marchandises catégorisé en Europe) - Filtrer les identificateurs et garder ceux respectant une expression régulière[^15] - Envoyer aux clients (dans le cas de l'annexe un, il y en a deux) un ensemble de tâches Swiss-Impex également réparti. -- Lors de la réception des tâches Swiss-Impex, le client va les lancer dans l'ordre de réception (ce qui va aboutir au téléchargement du document au format Excel) -- A la fin de chaque tâche Swiss Impex, le fichier XLSX est converti en CSV pour faciliter la lecture; Enfin, le fichier Excel est supprimé. +- Lors de la réception des tâches Swiss-Impex, le client va les envoyer dans l'ordre de réception (ce qui va aboutir au téléchargement du document au format Excel) +- A la fin de chaque tâche Swiss-Impex, le fichier XLSX est converti en CSV pour faciliter la lecture; Enfin, le fichier Excel est supprimé. Chaque instruction "attend" la précédente : le travail est donc fait de façon séquentielle. Toutefois, chaque travailleur n'en attend aucun autre : autrement dit, chaque processus va séquentiellement effectuer les tâches spécifiées dans le _playbook_ de son côté. +Dans le cas de Swiss-Impex, on choisit les documents qu'on souhaite recevoir : on choisira dans les mesures de récupérer tous les documents liés à une catégorie de marchandises, puis de tous les récupérer. + [^15]: Une expression régulière, ou Regex (ou encore RegExp) sont une chaîne de caractères décrivant un ensemble de chaînes possibles. ## Bilan diff --git a/rapport/text/5-mesures.md b/rapport/text/5-mesures.md new file mode 100644 index 0000000000000000000000000000000000000000..55f8070605a40932bde622e61bfb1854c48dada8 --- /dev/null +++ b/rapport/text/5-mesures.md @@ -0,0 +1,145 @@ +# Performances de NScrap + +Dans cette partie, nous étudierons plusieurs exécutions de NScrap afin de déterminer son comportement, ses performances et les résultats produits. +Nous commencerons par analyser un lancement de la FAO Genève en configuration réduite, puis sur plusieurs coeurs, puis sur deux machines avec plusieurs coeurs. +Nous continuerons par analyser un lancement réduit sur Swiss-Impex, c'est-à-dire un lancement sur une seule catégorie de marchandises; nous terminerons ce chapitre par l'analyse d'un lancement total sur Swiss-Impex. Nous partirons du principe qu'il y aura toujours une base de données, un serveur et au moins un client fonctionnel en tout temps. + +Le but de cette section est de répondre à deux questions : + +* Est-ce que l'automatisation de la récupération des documents est plus rapide que le téléchargement des documents un par un ? +* Est-ce que la distribution des tâches de téléchargement accélère le traitement des tâches ? + +L'ensemble des mesures de ce projet sont disponibles dans le dossier `projet/resources/measures`. + +## Analyse FAO Genève + +Nous allons nous intéresser au lancement de la récupération de $1000$ documents sur la FAO Genève. La configuration de NScrap sera faite de trois façons différentes : + +* Une machine, un travailleur (ce scénario sera abrégé 1M1T, pour une Machine une Travailleur) +* Une machine, six travailleurs (ce scénario sera abrégé 1M6T) +* Deux machines, six travailleurs chacune (ce scénario sera abrégé 2M6T) + +On utilise le _playbook_ présenté dans le fichier `projet/resources/playbooks/fao-geneve.yml`. Nous utilisons six coeurs : en effet, la majorité des machines aujourd'hui ont huit coeurs présents dans leur processeur. Utiliser six coeurs permet d'éviter de surcharger la machine (et donc de potentiellement ralentir le système). + +### Théorie + +Les documents sont au nombre de $1'000$. Si on part du principe que 50 documents sont sur une page, et que $50$ documents sont récupérés en une minute[^16], on peut poser : + +\begin{center} +$\frac{N_{documents} * T_{50 documents}}{50} = \frac{1000 * 60}{50} = 1200$ +\end{center} + +Soit 20 minutes théoriques dans le cas où nous n'avons qu'une machine et un travailleur. Dans le cas où nous avons $n$ travailleurs, il faudra diviser la durée par $n$; dans le cas où nous avons $n$ travailleurs et $k$ machines (où chaque machine dans $k$ a exactement $n$ travailleurs), il faudra diviser la durée théorique par $k*n$. + +[^16]: Vitesse supposée de téléchargement d'un humain ne faisant aucune faute et ne se fatiguant pas + +### Mesures + +Après envoi de la commande au-x client-s, on observe après chaque seconde le nombre de documents téléchargés au sein du dossier de chaque client. Les mesures seront effectuées quatre fois par scénario afin d'établir que nos mesures sont exactes. + +### Résultats + +Nous obtenons trois graphiques, soit un par scénario : + +\begin{figure} + \begin{subfigure}{\linewidth} + \includegraphics[width=.5\linewidth]{figs/measures/1m1t.pdf}\hfill + \includegraphics[width=.5\linewidth]{figs/measures/1m6t.pdf}\hfill + \centering + \includegraphics[width=.5\linewidth]{figs/measures/2m6t.pdf} + \end{subfigure}\par\medskip + \caption{Performances de la FAO Genève sur 1000 documents} + \caption*{Source : réalisé par Théo Pirkl} +\end{figure} + +Comme nous pouvons le constater, nous avons largement dépassé la vitesse théorique d'un humain. En prenant le cas du premier graphique (c'est-à-dire le scénario 1M1T), on peut observer sur la courbe croissant le moins vite qu'on atteint une vitesse de traitement de données de 1.84 documents par seconde, soit une vitesse d'environ 110 documents par minutes, soit deux fois plus vite qu'un être humain. +Les temps moyens sont : + +* Dans le premier scénario on obtient comme temps $542$, $534$, $496$ et $398$ secondes, pour un temps moyen de $492.5$ secondes; +* Dans le second, les temps sont de $271$, $181$, $212$ et $258$ secondes, donnant en moyenne $230.5$ secondes; +* Le dernier scénario a des mesures de temps les plus petites, de $71$, $46$, $54$ et $52$ secondes, pour un temps moyen de $55.75$ secondes. +Au vu des temps obtenus, il est évident que le scénario la plus efficace est le 2M6T. + +On peut se donner une idée plus concrète de performance en convertissant les scores en pourcentage de performance. On prend le score moyen du scénario 1M1T comme base, et on divise ce score par les autres scores moyens obtenus, ce qui nous donnera un pourcentage de performance. Ce pourcentage sera par rapport à la performance du premier scénario. Cela donne : + +* $\frac{492.5}{230.5} \approx 2.13$, soit environ $213\%$ d'efficacité en plus. +* $\frac{492.5}{55.75} \approx 8.83$, soit environ $883\%$ d'efficacité en plus. + +On constate plusieurs choses. D'une part, le multiprocessing et la distribution des tâches apportent des performances accrues : $883\%$ est une amélioration considérable qui est la bienvenue si l'on traite des gros volumes de fichier. Pour se donner un ordre d'idée, un humain a besoin de huit heures pour récupérer 24'000 documents (selon l'estimation de vitesse faite plus haut). En gagnant $883\%$ de performance, on réduit ce temps à un peu moins d'une heure. +D'autre part, on remarque que la fonction $Pourcentage_{performance}(Nombre_{coeurs})$ ne semble pas linéaire. Nous pouvons l'étudier pour se donner une idée de la courbe de gain de performance en fonction du nombre de coeurs. + +\cimg{figs/measures/faogeneve-perf-analysis.pdf}{scale=.8}{Analyse de la fonction de gain de performance du module FAO Genève distribué}{Source : réalisé par Théo Pirkl} + +Des fonctions usuelles nous donnent une idée de la croissance et du "type" de fonction que serait la fonction de gain de performance. Il semblerait que la courbe de gain de performances soit de plus en plus performante, un peu comme une exponentielle (bien qu'elle ne croit pas aussi vite qu'une véritable exponentielle). +Ces constats se basent sur les mesures faites et présentées plus haut : il est envisageable que la croissance de la fonction de gain explose un peu plus loin, et que le constat que nous venons de faire sera caduc. Toujours est-il que notre gain ne semble pas linéaire. + +### Bilan + +Au vu de ce qui a été dit plus haut, nous pouvons répondre aux questions que nous avons posé de cette façon : + +* L'automatisation du téléchargement des documents, dans le cas de la FAO Genève, est significativement plus rapide que le téléchargement des documents un à un; +* La distribution des tâches de téléchargement rend ce qui était déjà rapide encore plus rapide avec un gain, comme nous l'avons observé, de $883\%$. + +Le scraping semble donc extrêmement utile dans le cas de la FAO. + +## Analyse Swiss-Impex réduite + +Nous allons maintenant analyser le module Swiss-Impex. Ce module est plus intéressant à étudier que la FAO Genève : en effet, Swiss-Impex est un scrapper de catégorie deux. Ces modules sont plus complets et complexes que ceux de première catégorie. La récupération des données prendra bien plus de temps que la FAO Genève. +Dans le cas d'une analyse Swiss-Impex réduite, on ne s'intéresse qu'à une seule catégorie de marchandises. Dans ce cas, on s'intéressera à la catégorie *2709.0090*, ce qui correspond aux données pétrolières Suisses. + +On utilise le _playbook_ présenté dans le fichier `projet/resources/playbooks/swiss-impex-petroleum.yml`. + +### Théorie + +Swiss-Impex propose un rapport d'import/export par mois depuis 1988 jusqu'à 2019 (les informations de 2020 étant encore relativement inexactes). +On peut donc calculer le nombre de documents à $12 * (2019 - 1989) = 360$. + +En admettant que chaque document prend une minute pour être téléchargé par un humain. Avec une seule machine ayant six workers, cela prendrait donc une heure. Pour réduire au plus ce temps, nous allons utiliser vingt machines. Chacune de ces machines aura un travailleur. Nous aurons donc un total de 20 travailleurs capables d'effectuer des tâches simultanément. Nous choisissons de ne pas mettre trop de travailleurs : en effet, trop de travailleurs déclenchent un déni de service accidentel sur le site, le rendant inopérant temporairement. +Nous passons donc de une heure à dix-huit minutes théoriques. + +### Mesures + +Après envoi de la commande aux clients, on pourrait observer toutes les quinze secondes[^17] le nombre de documents téléchargés (le total calculé sur toutes les machines). Toutefois, compte tenu de nombre de clients, nous allons plutôt observer le nombre d'entrées dans la base de données centrale. En effet, chaque document à traiter correspond à une entrée dans la base de données. Cela ne changera rien à nos mesures. Le graphique sera toutefois inversé : plutôt que de commencer à 0 documents téléchargés, on commencera à 360 documents en attente de téléchargement. La courbe ne croîtra donc pas mais descendra progressivement jusqu'à 0. Toutefois, cela ne nous empêche pas de calculer le pourcentage de gain d'efficacité. + +[^17]: Observer plus rapidement que toutes les quinze secondes saturerait le protocole de communication : les mesures arriveraient tardivement et seraient décalées à la réalité. Nos mesures seraient alors biaisées. + +### Résultats + +Comme nous l'avons indiqué plus haut, les scrappers sont très sensibles aux changements de site. Si l'éditeur proposant le site n'a pas d'accord avec l'entité scrappant son site, elle peut du jour au lendemain mettre à jour son site et donc potentiellement rendre le scrapper inutile. C'est ce qui est arrivé dans notre cas : au moment de la mesure, Swiss Impex avait changé des informations permettant au moteur javascript de se repérer sur la page. Le scraper Swiss-Impex est alors devenu "aveugle" et ne pouvait plus traiter les documents proprement. La structure, l'apparence ou la logique interne du site n'avaient manifestement pas été changées : seuls les éléments permettant au scrapper de se repérer avaient été changés. +Toujours au moment de la mesure, il était trop tard pour mettre à jour le scrapper convenablement : il a donc été laissé en l'état. +Des informations intéressantes ont toutefois pu être récoltées : il est nécessaire de limiter volontairement le nombre de travailleurs agissant en même temps sur un site, sans quoi l'on peut se retrouver banni. C'est ce qui arrivé : les ordinateurs de l'HEPIA n'ont pas été bannis, pourtant c'est eux qui ont généré le plus gros volume de données. Quant à l'ordinateur sur lequel ce projet a été conçu, il a été banni relativement rapidement (à ce jour, il n'a pas totalement été débanni). Cela laisse à penser que Swiss-Impex autorise toutes les adresses IPs étatiques à télécharger autant qu'elles le souhaitent. Enfin, au vu de l'échec de la récupération des données, de la difficulté à faire fonctionner proprement le scraper et des changements, il est possible que Swiss-Impex tente activement de bloquer les scrapers. Aucune preuve concrète n'est disponible, toutefois sur l'expérience de ce travail de semestre, cela reste une possibilité. + +Il est impossible en l'état de déterminer un facteur d'efficacité concret, mais il est toutefois possible de consulter le fichier `resources/measures/tasks-perf.csv`, qui est la mesure de temps qu'a pris chaque tâche, mesure intégrée à toutes les tâches traitées par NScrap. Ce temps n'est disponible que si la tâche a réussi : on peut donc considérer ces temps comme valides. +Dès lors, on peut donc au moins déterminer quelques informations. +Nous avons dans ce fichier 103 entrées : nous pouvons donc calculer un temps moyen nécessaire à la récupération d'un document. Ce temps moyen donne en l'occurence $37.1 [s]$. +Si on applique ce temps moyen au nombre de documents que nous allons télécharger, on obtient un temps de $37 [s] * 360$, ce qui donne trois heures et 42 minutes avec un seul travailleur, et environ 11 minutes avec 20 travailleurs. Ce qui est de toute manière plus efficace qu'un humain (même à un seul travailleur) : si on garde la vitesse de récupération théorique d'un humain, on est $162\%$ plus efficace. + +### Bilan + +L'application de NScrap sur le site Swiss-Impex n'est pas un franc succès. Nous n'avons pas pu récupérer les informations du site d'une catégorie de marchandises : à partir de $100$ connexions (venant d'IPs différentes), le site s'arrête de fonctionner, ce qui fait planter le scraper. Il faut donc réduire le nombre de workers total pour pouvoir être en mesure de télécharger correctement les informations du site. Il est toutefois possible d'en tirer un grand nombre d'enseignements, qui pourront mener sur des fonctionnalités potentiellement implémentables pendant le travail de bachelor. Ce n'est donc pas une perte, loin de là puisqu'on est malgré tout capable, en plus des enseignements collectés, d'obtenir quelques informations en extrapolant les données à notre disposition. + +On peut tenter de répondre aux questions que nous avons posées au début de ce chapitre : + +* L'automatisation de la récupération des documents semble plus rapide que la récupération de documents un par un; +* La distribution semble aussi accélérer la récupération de documents. Si on se base toutefois seulement sur les mesures de temps citées plus haut, il est impossible ici de le prouver. + +## Analyse Swiss-Impex totale + +Nous allons finalement effectuer un téléchargement complet de Swiss-Impex, sur toutes les données possibles à télécharger. + +### Théorie + +Toujours dans l'optique qu'un utilisateur est capable de télécharger un document en une minute, commençons par calculer le nombre de documents théoriquement disponible sur Swiss-Impex. +Si on consulte la liste de toutes les catégories de marchandise disponibles dans `resources/EUMerchIDs.txt` et qu'on considère les lignes contenant une marchandise précise (à savoir les lignes comportant quatre chiffres, un point, puis à nouveau quatre chiffres), on a un total de $6 837$ catégories. + +En partant du principe que chaque catégorie contient (comme les données pétrolières) $360$ documents, on arrive à un total de $2 461 320$ documents à télécharger. Nous ne pouvons pas démarrer trop de noeuds sans quoi le serveur distant va s'arrêter. Nous allons donc rester avec $20$ noeuds. + +Cette section n'aura pas de partie mesures ou résultats, ni de bilan : en effet, au vu de ce qui précède, nous ne pouvons pas récolter de mesures sur Swiss-Impex. On peut toutefois estimer le temps nécessaire total de récolte théorique en se basant sur la mesure de la section du dessus : $2461320 * 37 = 91 068 840 [s]$, soit 37 mois, c'est-à-dire la durée de plus de cinq projets de semestres mis bout-à-bout. +L'analyse Swiss-Impex totale reprend toutes les caractéristiques de l'analyse Swiss-Impex partielle, à la seule différence qu'elle est plus longue. Il semble donc redondant d'ajouter un bilan à cette partie : il est plus intéressant de faire un bilan global des résultats. + +## Bilan global des résultats + +Les résultats sont plutôt prometteurs. On observe, malgré la difficulté à en obtenir certaines, des mesures prouvant à quelle point la machine peut aider l'Homme à la récupération de données, et à quel point il est facile de décupler la vitesse de récupération. Il est aussi possible d'apprendre des échecs lors de nos mesures : les scrapers ne sont pas évidents à maintenir, car aucun accord n'est véritablement établi entre l'auteur du site et l'utilisateur du scrapper. Tout peut cesser de fonctionner du jour au lendemain, que cela soit à cause d'un changement du site web, de politique quant aux scrapers, d'un excès de trafic venant du scrapper, ou à une maintenance. +Outre la difficulté, une augmentation observée sur les sites traités à un minimum de $200\%$ prouve à quel point les scrapers sont une catégorie précieuse de logiciels. Si le scraper fonctionne, les résultats peuvent s'avérer suffisamment intéressants pour passer outre la difficulté. + +\pagebreak \ No newline at end of file diff --git a/rapport/text/6-conclusion.md b/rapport/text/6-conclusion.md new file mode 100644 index 0000000000000000000000000000000000000000..68ad89156ce6231a945d1ff8a8a7eb4a44d9cbfb --- /dev/null +++ b/rapport/text/6-conclusion.md @@ -0,0 +1,15 @@ +# Conclusion {-} + +Le but de ce travail était de mettre en place une solution de scraping suffisamment flexible pour qu'elle soit utilisée sur théoriquement n'importe quel site et par n'importe qui. Un framework de scraping a en effet été conçu, nommé NScrap. La démarche suivie était de proposer, à la façon de bien des logiciels, un système ne nécessitant aucune connaissance en informatique mais la simple rédaction d'un fichier de commandes. +NScrap permet à l'heure actuelle de télécharger de façon efficace des documents sur plusieurs sites (et peut être étendu vers d'autres) de cette façon, mais ne permet pas encore suffisamment d'être utilisé par n'importe qui. Les résultats obtenus sont prometteurs : ils montrent à quel point on peut gagner en performance en quelques actions simples. Les résultats montrent aussi à quel point les scrapers sont sensibles aux changements des sites web et à quel point il est nécessaire de les tenir à jour. + +Durant la création de ce travail et la rédaction de ce rapport, j'ai eu l'occasion de découvrir le sujet du scraping en profondeur, et de découvrir des difficultés me semblant au début du travail inexistantes. J'ai pu expérimenter les avantages du multiprocessing et de la distribution des tâches; ce fut certainement un des sujets présent dans ce travail qui m'a apporté le plus de connaissances et de problèmes. +J'ai aussi pu faire connaissance avec la complexité invisible du web et proposer des solutions pour simplifier cette complexité. +J'ai pu en outre apprendre à mes dépens que peu importe son organisation, on peut perdre un pan de son travail en quelques minutes; dans le domaine du scraping, il n'y a pas grand-chose que l'on peut faire pour l'éviter. +C'est toutefois une excellente expérience qui a certainement pu m'apprendre plus de choses qu'un travail sans accroc. Toutes les difficultés rencontrées durant ce travail sont bénéfiques puisqu'elles ont pu prodiguer à ce projet non seulement d'excellents enseignements, qui seront aussi utilisables dans la vie de tous les jours. + +Nous avons établi que le travail est performant, qu'il fonctionne de façon optimale, mais qu'il est encore difficile d'accès pour un utilisateur lambda. Une amélioration semblant tout à fait nécessaire serait la conception et l'implémentation d'une interface (+WYSIWYG_a) : l'utilisateur pourrait définir son playbook en connectant des boîtes et des fils, chaque boîte représentant une tâche spécifique (ouvrir un fichier, scraper un document, etc.). De cette façon, l'objectif d'avoir un scraper accessible à tous et à toutes serait encore plus atteint. De plus, en proposant une interface graphique à l'utilisateur (comme une page web), on peut faire abstraction de la complexité de l'infrastructure du point de vue utilisateur. + +Dans ce cadre, on quitte un peu le cadre du logiciel de scraping : un logiciel (+WYSIWYG_a) de type "workflow" (c'est-à-dire comme indiqué plus haut, à base de boîtes et de fils connectables) se rapproche plus d'un utilitaire "à tout faire" que d'un logiciel de scraping, puisqu'on peut tout à fait choisir de s'en servir pour autre chose que du téléchargement en masse de documents. Ça n'est toutefois pas un problème à priori et c'est dans cette direction que nous nous dirigerons lors du prochain travail. + +\pagebreak \ No newline at end of file diff --git a/rapport/text/7-annexes.md b/rapport/text/7-annexes.md new file mode 100644 index 0000000000000000000000000000000000000000..d342786693db7444546fe7590fdece562b1e08d5 --- /dev/null +++ b/rapport/text/7-annexes.md @@ -0,0 +1,41 @@ +# Annexes {-} + +\newappendix{Exemple de fichier playbook} +```yaml +clients: # The default management port for a client is 18965 + - "129.194.187.141" + - "129.194.187.142" + +chapters: + File Parser: + file: ./resources/EUMerchIDs.txt + server: yes # Will be run on server + instructions: + read: yes + then: + + Regex Parser: + input: "!fileParserOutput" + regex: "[0-9]{4}.[0-9]{4}" + server: yes # Will not be sent to client + then: # Sent to client from here only ! + + Swiss Impex: + year: {start: 1989, end: 2020} # 1989 - 2019 + month: {start: 0, end: 12} + merchandiseId: "!regexParserOutput" + then: + + XLSX Parser: + file: "!swissImpexOutputfileName" + from: "A6" + to: "H197" + instructions: + - replace: + - "*" + - "" + - export: csv + - cleanup: yes +``` + +\pagebreak \ No newline at end of file diff --git a/rapport/text/8-bibliographie.md b/rapport/text/8-bibliographie.md new file mode 100644 index 0000000000000000000000000000000000000000..3b5583f182a59a405705141d0ff375e94466c08a --- /dev/null +++ b/rapport/text/8-bibliographie.md @@ -0,0 +1 @@ +# Références documentaires {-}