diff --git a/ecrire/inc_statistiques.php3 b/ecrire/inc_statistiques.php3
index 75566a986135a96d4600d2fd00381da08d61d453..388bfc1d9a4999265fc580e1d06d77fa591e998c 100644
--- a/ecrire/inc_statistiques.php3
+++ b/ecrire/inc_statistiques.php3
@@ -94,12 +94,17 @@ function stats_show_keywords($kw_referer, $kw_referer_host) {
 // Compiler les statistiques temporaires : visites et referers (si active)
 //
 
-function calculer_referers($date) {
-	// Referers sur tout le site
+function calculer_100_referers() {
+	$nombre_de_refs = 100;
+	$date = date("Y-m-d");
+
+	// Selectionner 100 referers sur tout le site
 	$query = "SELECT COUNT(DISTINCT ip) AS visites, referer, HEX(referer_md5) AS md5 ".
-		"FROM spip_referers_temp GROUP BY referer_md5";
+		"FROM spip_referers_temp GROUP BY referer_md5 LIMIT 0,$nombre_de_refs";
 	$result = spip_query($query);
 
+	$encore = (mysql_num_rows($result) == $nombre_de_refs);
+
 	$referer_insert = "";
 	$referer_update = "";
 
@@ -110,6 +115,7 @@ function calculer_referers($date) {
 
 		$referer_update[$visites][] = $referer_md5;
 		$referer_insert[] = "('$date', '$referer', $referer_md5, $visites)";
+		$referer_vus[] = $referer_md5;
 	}
 
 	// Mise a jour de la base
@@ -120,15 +126,17 @@ function calculer_referers($date) {
 			$result = spip_query($query);
 		}
 	}
+
 	if (is_array($referer_insert)) {
 		$query_insert = "INSERT DELAYED IGNORE INTO spip_referers ".
 			"(date, referer, referer_md5, visites) VALUES ".join(', ', $referer_insert);
 		$result_insert = spip_query($query_insert);
 	}
 
-	// Referers par article
+	// Ventiler ces referers article par article
+	$where = (is_array($referer_vus)) ? "AND referer_md5 IN (".join(',',$referer_vus).")" : "";
 	$query = "SELECT COUNT(DISTINCT ip) AS visites, id_objet, referer, HEX(referer_md5) AS md5 ".
-		"FROM spip_referers_temp WHERE type='article' GROUP BY id_objet, referer_md5";
+		"FROM spip_referers_temp WHERE type='article' $where GROUP BY id_objet, referer_md5";
 	$result = spip_query($query);
 
 	$referer_insert = "";
@@ -158,8 +166,26 @@ function calculer_referers($date) {
 		$result_insert = spip_query($query_insert);
 	}
 
-	$query_effacer = "DELETE FROM spip_referers_temp";
-	$result_effacer = spip_query($query_effacer);	
+	if (is_array($referer_vus)) {
+		$query_effacer = "DELETE FROM spip_referers_temp WHERE referer_md5 IN (".join(",",$referer_vus).")";
+		$result_effacer = spip_query($query_effacer);	
+	}
+
+	// a-t-on atteint le dernier referer ?
+	return $encore;
+}
+
+function calculer_referers() {
+	$encore = calculer_100_referers();
+	if ($encore) {
+		include_ecrire("inc_meta.php3");
+		ecrire_meta ("calculer_referers_now", "oui");
+		ecrire_metas();
+	} else {
+		// un peu de menage
+		supprimer_referers();
+		supprimer_referers("article");
+	}
 }
 
 
@@ -214,9 +240,9 @@ function calculer_visites($date = "") {
 		}
 	}
 
-	if (lire_meta('activer_statistiques_ref') != 'non') {
+/*	if (lire_meta('activer_statistiques_ref') != 'non') {
 		calculer_referers($date);
-	}
+	} */
 }
 
 
diff --git a/inc-stats.php3 b/inc-stats.php3
index 4e1a2df8acd48409e4f0510adf4bad26b559c297..7bf4efc347a63394da4fec46e66a79dde54c008c 100644
--- a/inc-stats.php3
+++ b/inc-stats.php3
@@ -8,7 +8,6 @@ define("_INC_STATS", "1");
 function ecrire_stats() {
 	global $id_article, $id_breve, $id_rubrique, $admin_ok;
 
-	$activer_referers = lire_meta('activer_statistiques_ref');
 
 	// Essai de fichier de log simplifie
 	$log_ip = $GLOBALS['REMOTE_ADDR'];
@@ -29,9 +28,6 @@ function ecrire_stats() {
 		$log_id_num = 0;
 	}
 
-	$date = date("Y-m-d");
-	$last_date = lire_meta("date_statistiques");
-
 	// Conversion IP 4 octets -> entier 32 bits
 	if (ereg("^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$", $log_ip, $r)) {
 		$log_ip = sprintf("0x%02x%02x%02x%02x", $r[1], $r[2], $r[3], $r[4]);
@@ -39,7 +35,19 @@ function ecrire_stats() {
 	else return;
 
 	// Archivage des visites temporaires
-	if ($date != $last_date) {
+	$date = date("Y-m-d");
+	$last_date = lire_meta("date_statistiques");
+
+	if (lire_meta('calculer_referers_now') == 'oui') {
+		include_ecrire("inc_connect.php3");
+		if ($GLOBALS['db_ok']) {
+			include_ecrire("inc_meta.php3");
+			include_ecrire("inc_statistiques.php3");
+			ecrire_meta('calculer_referers_now', 'non');
+			ecrire_metas();
+			calculer_referers();
+		}
+	} else if ($date != $last_date) {
 		include_ecrire("inc_connect.php3");
 		if ($GLOBALS['db_ok']) {
 			include_ecrire("inc_meta.php3");
@@ -47,6 +55,11 @@ function ecrire_stats() {
 			ecrire_meta("date_statistiques", $date);
 			ecrire_metas();
 			calculer_visites($last_date);
+			// poser un message pour le prochain hit
+			if (lire_meta('activer_statistiques_ref') == 'oui') {
+				ecrire_meta('calculer_referers_now','oui');
+				ecrire_metas();
+			}
 		}
 	}
 
@@ -61,7 +74,7 @@ function ecrire_stats() {
 	}
 
 	// Log complexe (referers)
-	if ($activer_referers == 'oui') {
+	if (lire_meta('activer_statistiques_ref') == 'oui') {
 		$url_site_spip = lire_meta('adresse_site');
 		$url_site_spip = eregi_replace("^(https?|ftp://)www\.", "\\1(www)?\.", $url_site_spip);
 		$log_referer = $GLOBALS['HTTP_REFERER'];
@@ -89,17 +102,15 @@ function ecrire_stats() {
 	}
 
 
-	// Effacer les referers
+	// traiter les referers toutes les heures
 	$date_refs = lire_meta('date_stats_referers');
-	if ((time() - $date_refs) > 24 * 3600) {
+	if ((time() - $date_refs) > 3600) {
 		include_ecrire("inc_connect.php3");
 		if ($GLOBALS['db_ok']) {
 			include_ecrire("inc_meta.php3");
 			ecrire_meta("date_stats_referers", time());
+			ecrire_meta('calculer_referers_now', 'oui');
 			ecrire_metas();
-			include_ecrire ("inc_statistiques.php3");
-			supprimer_referers();
-			supprimer_referers("article");
 		}
 	}