diff --git a/SearchBox-CLI/Program.cs b/SearchBox-CLI/Program.cs index 64d3832..7e2db00 100644 --- a/SearchBox-CLI/Program.cs +++ b/SearchBox-CLI/Program.cs @@ -7,6 +7,8 @@ using Newtonsoft.Json; using LibSearchBox; using System.Text.RegularExpressions; using Newtonsoft.Json.Serialization; +using System.Threading.Tasks; +using SBRL.Utilities; namespace SearchBoxCLI { @@ -156,22 +158,23 @@ namespace SearchBoxCLI if (!Batch) searchBox.AddDocument(Name, Tags, Source.ReadToEnd()); else { - string nextLine = ""; - while ((nextLine = Source.ReadLine()) != null) { - string[] parts = nextLine.Split('|'); - if (parts[0].Trim().Length == 0) - continue; - try { + try + { + Parallel.ForEach(LineIterator.GetLines(Source), (string nextLine) => { + string[] parts = nextLine.Split('|'); + if (parts[0].Trim().Length == 0) + return; + searchBox.AddDocument( parts[1].Trim(), Regex.Split(parts[2], @",\s*"), File.ReadAllText(parts[0].Trim()) ); Console.Error.WriteLine($"[Searchbox] [add] {parts[0].Trim()}"); - } catch (FileNotFoundException) { - Console.Error.WriteLine($"Error: Can't find file {parts[2].Trim()}."); - return 1; - } + }); + } catch (FileNotFoundException error) { + Console.Error.WriteLine(error.Message); + return 1; } } diff --git a/SearchBox-CLI/SearchBox-CLI.csproj b/SearchBox-CLI/SearchBox-CLI.csproj index 9560f3a..110dd92 100644 --- a/SearchBox-CLI/SearchBox-CLI.csproj +++ b/SearchBox-CLI/SearchBox-CLI.csproj @@ -40,6 +40,7 @@ + @@ -50,5 +51,8 @@ + + + \ No newline at end of file diff --git a/SearchBox-CLI/Utilities/LineIterator.cs b/SearchBox-CLI/Utilities/LineIterator.cs new file mode 100644 index 0000000..5d2cc1a --- /dev/null +++ b/SearchBox-CLI/Utilities/LineIterator.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace SBRL.Utilities +{ + static class LineIterator { + + public static IEnumerable GetLines(TextReader source) + { + string nextLine; + while ((nextLine = source.ReadLine()) != null) { + yield return nextLine; + } + } + + public static IEnumerable GetLines(string source) + { + source = source.Replace("\r\n", "\n"); + int curPosition = 0, nextIndex; + while (true) + { + nextIndex = source.IndexOf("\n", curPosition); + if (nextIndex == -1) + break; + + yield return source.Substring(curPosition, nextIndex - curPosition); + + curPosition = nextIndex + 1; + } + } + + } +} \ No newline at end of file diff --git a/SearchBox/IdMap.cs b/SearchBox/IdMap.cs index 05b572a..3403ee6 100644 --- a/SearchBox/IdMap.cs +++ b/SearchBox/IdMap.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; using Newtonsoft.Json; using Stackoverflow.Utilities; @@ -41,6 +42,12 @@ namespace LibSearchBox nextId = map.Max((pair) => pair.First) + 1; } + private int generateNewId() + { + int incremented = Interlocked.Increment(ref nextId); + return incremented - 1; // Only the incrementing itself has to be atomic + } + public int GetId(string pageName) { @@ -49,7 +56,7 @@ namespace LibSearchBox int result; if (!map.TryGetBySecond(pageName, out result)) { - map.Add(result = nextId++, pageName); + map.Add(result = generateNewId(), pageName); } return result; } diff --git a/SearchBox/Utilities/BiDictionary.cs b/SearchBox/Utilities/BiDictionary.cs index 42e4328..be67835 100644 --- a/SearchBox/Utilities/BiDictionary.cs +++ b/SearchBox/Utilities/BiDictionary.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Concurrent; using System.Collections.Generic; namespace Stackoverflow.Utilities @@ -26,9 +27,9 @@ namespace Stackoverflow.Utilities public struct Enumerator : IEnumerator, IEnumerator { - public Enumerator(Dictionary.Enumerator dictEnumerator) + public Enumerator(IEnumerable> dictEnumerator) { - _dictEnumerator = dictEnumerator; + _dictEnumerator = dictEnumerator.GetEnumerator(); } public Pair Current { @@ -61,7 +62,7 @@ namespace Stackoverflow.Utilities throw new NotSupportedException(); } - private Dictionary.Enumerator _dictEnumerator; + private IEnumerator> _dictEnumerator; } @@ -78,8 +79,8 @@ namespace Stackoverflow.Utilities if (_firstToSecond.ContainsKey(first) || _secondToFirst.ContainsKey(second)) throw new ArgumentException("Duplicate first or second"); - _firstToSecond.Add(first, second); - _secondToFirst.Add(second, first); + _firstToSecond.TryAdd(first, second); + _secondToFirst.TryAdd(second, first); } /// @@ -124,8 +125,8 @@ namespace Stackoverflow.Utilities if (!_firstToSecond.TryGetValue(first, out second)) throw new ArgumentException("first"); - _firstToSecond.Remove(first); - _secondToFirst.Remove(second); + _firstToSecond.TryRemove(first, out TSecond noop); + _secondToFirst.TryRemove(second, out TFirst noopAgain); } /// @@ -139,8 +140,8 @@ namespace Stackoverflow.Utilities if (!_secondToFirst.TryGetValue(second, out first)) throw new ArgumentException("second"); - _secondToFirst.Remove(second); - _firstToSecond.Remove(first); + _secondToFirst.TryRemove(second, out TFirst noop); + _firstToSecond.TryRemove(first, out TSecond noopAgain); } #endregion @@ -159,9 +160,9 @@ namespace Stackoverflow.Utilities if (_firstToSecond.ContainsKey(first) || _secondToFirst.ContainsKey(second)) return false; - _firstToSecond.Add(first, second); - _secondToFirst.Add(second, first); - return true; + bool result = _firstToSecond.TryAdd(first, second); + result = _secondToFirst.TryAdd(second, first) || result; + return result; } @@ -200,9 +201,9 @@ namespace Stackoverflow.Utilities if (!_firstToSecond.TryGetValue(first, out second)) return false; - _firstToSecond.Remove(first); - _secondToFirst.Remove(second); - return true; + bool result = _firstToSecond.TryRemove(first, out TSecond noop); + result = _secondToFirst.TryRemove(second, out TFirst noopAgain) || result; + return result; } /// @@ -216,8 +217,8 @@ namespace Stackoverflow.Utilities if (!_secondToFirst.TryGetValue(second, out first)) return false; - _secondToFirst.Remove(second); - _firstToSecond.Remove(first); + _secondToFirst.TryRemove(second, out TFirst noop); + _firstToSecond.TryRemove(first, out TSecond noopAgain); return true; } @@ -243,7 +244,7 @@ namespace Stackoverflow.Utilities public Enumerator GetEnumerator() { //enumerator.Reset(firstToSecond.GetEnumerator()); - return new Enumerator(_firstToSecond.GetEnumerator()); + return new Enumerator(_firstToSecond); } IEnumerator IEnumerable.GetEnumerator() @@ -258,8 +259,8 @@ namespace Stackoverflow.Utilities - private Dictionary _firstToSecond = new Dictionary(); - private Dictionary _secondToFirst = new Dictionary(); + private ConcurrentDictionary _firstToSecond = new ConcurrentDictionary(); + private ConcurrentDictionary _secondToFirst = new ConcurrentDictionary(); } } \ No newline at end of file