private static void GetReview(int movieId, StreamReader reader, ReviewDatabaseLayer <NonIndexedReview> reviewDb) { var watch = new Stopwatch(); watch.Start(); var counter = 0; var reviews = new List <Review> (); string line; while ((line = reader.ReadLine()) != null) { var splits = line.Split(','); var review = new Review { MovieId = movieId, UserId = int.Parse(splits[0]), Note = int.Parse(splits[1]), Date = DateTime.Parse(splits[2]) }; reviews.Add(review); counter++; } }
private static void GetReview(string path, ReviewDatabaseLayer <NonIndexedReview> reviewDb) { using (var reader = File.OpenText(path)) { var line = reader.ReadLine(); var movieId = int.Parse(line.Substring(0, line.Length - 1)); GetReview(movieId, reader, reviewDb); } var count = Interlocked.Increment(ref _reviewCounter); Logger.Info(string.Format("{0} review done : {1}", count, path)); }
public static void ImportReviews(string directory = DefaultReviewDirectory) { if (!string.IsNullOrEmpty(directory)) { if (Directory.Exists(directory)) { // on crée l'objet qui gère la base var reviewDb = new ReviewDatabaseLayer <NonIndexedReview>(); // on choppe tous les fichiers du dossier var allFiles = Directory.GetFiles(directory); var files = new List <string>(); // juste un trie parce que j'ai du le faire en plusieurs fois mmm foreach (var f in allFiles) { if (CheckFile(f)) { files.Add(f); } } allFiles = null; // On découpe la liste de fichier... var splits = files.Split(200); // On fait le boulot en parallèle, mais pour chaque groupe de fichiers foreach (var groupOfFiles in splits) { var bag = new ConcurrentBag <NonIndexedReview>(); Parallel.ForEach(groupOfFiles, currentFile => { GetReview(currentFile, bag); }); var watch = new Stopwatch(); watch.Start(); Logger.Info(string.Format("Saving {0} reviews", bag.Count)); reviewDb.Save(bag); watch.Stop(); Logger.Info(string.Format("Saved in {0} ms", watch.Elapsed)); } // var counter = 0; // foreach(var file in files) // { // if (counter++ > 500) // return; // // GetReview(file, reviewDb); // } } else { Logger.Error(string.Format("Directory {0} does not exist", directory)); } } else { Logger.Error("Je crois, c'est pas bon"); } }
public override void Import() { if (!string.IsNullOrEmpty(Source)) { if (Directory.Exists(Source)) { // on crée l'objet qui gère la base var reviewDb = new ReviewDatabaseLayer <NonIndexedReview>(Target); // on choppe tous les fichiers du dossier var allFiles = Directory.GetFiles(Source); var files = new List <string>(); // pour calculer la progression var totalFileCount = allFiles.Length; // juste un trie parce que j'ai du le faire en plusieurs fois mmm if (StartFile > 0) { foreach (var f in allFiles) { if (CheckFile(f)) { files.Add(f); } } } allFiles = null; // On découpe la liste de fichier... var splits = files.Split(ChunkSize); // On fait le boulot en parallèle, mais pour chaque groupe de fichiers foreach (var groupOfFiles in splits) { var bag = new ConcurrentBag <NonIndexedReview>(); Parallel.ForEach(groupOfFiles, currentFile => { GetReview(currentFile, bag); }); // On a mis les reviews dans un bag en // mais on fait la sauvegarder sur un thread, c'est El Goulot var watch = new Stopwatch(); watch.Start(); var message = string.Format("Saving {0} reviews", bag.Count); Logger.Info(message); // On cancel avant le save, qui est suuper long if (CancelationPending) { Report(0, "Importation cancelled"); return; } // Progress var progress = ((float)_fileCount) / totalFileCount * 100; Report(progress, message); reviewDb.Save(bag); watch.Stop(); var savedMessage = string.Format("Saved in {0} ms", watch.Elapsed); Report(progress, savedMessage); Logger.Info(savedMessage); } } else { throw new ArgumentException(string.Format("File {0} does not exist", Source)); } } else { throw new ArgumentNullException("Source can not be null or empty"); } }