我已经构建了这段代码来并行处理大量字符串之间的字符串比较,以加快速度。
我使用了 ConcurrentBag,因此所有线程(任务)都可以写入线程安全集合。然后我将这个集合转储到一个文件中。
我遇到的问题是ConcurrentBag<string> log
,我转储到文件的填充速度比写入文件的速度快。所以我的程序不断消耗越来越多的内存,直到内存不足。
我的问题是我能做什么?改进对日志的写入?暂停任务直到 ConcurrentBag 被转储然后恢复任务?最快的选择是什么?
这是代码:
CsvWriter csv = new CsvWriter(@"C:\test.csv");
List<Bailleur> bailleurs = DataLoader.LoadBailleurs();
ConcurrentBag<string> log = new ConcurrentBag<string>();
int i = 0;
var taskWriteToLog = new Task(() =>
{
// Consume the items in the bag
string item;
while (true) // (!log.IsEmpty)
{
if (!log.IsEmpty)
{
if (log.TryTake(out item))
{
csv.WriteLine(item);
}
else
Console.WriteLine("Concurrent Bag busy");
}
else
{
System.Threading.Thread.Sleep(1000);
}
}
});
taskWriteToLog.Start();
Parallel.ForEach(bailleurs, s1 =>
{
foreach (Bailleur s2 in bailleurs)
{
var lcs2 = LongestCommonSubsequenceExtensions.LongestCommonSubsequence(s1.Name, s2.Name);
string line = String.Format("\"LCS\",\"{0}\",\"{1}\",\"{2}\"", s1.Name, s2.Name, lcs2.Item2);
log.Add(line);
// Console.WriteLine(line);
var dic = DiceCoefficientExtensions.DiceCoefficient(s1.Name, s2.Name);
line = String.Format("\"DICE\",\"{0}\",\"{1}\",\"{2}\"", s1.Name, s2.Name, dic);
log.Add(line);
// Console.WriteLine(line);
}
i++;
Console.WriteLine(i);
});
public class CsvWriter
{
public string FilePath { get; set; }
private FileStream _fs { get; set; }
private StreamWriter _sw { get; set; }
public CsvWriter2(string filePath)
{
FilePath = filePath;
_fs = new FileStream(FilePath, FileMode.Create, FileAccess.Write);
_sw = new StreamWriter(_fs);
}
public void WriteLine(string line)
{
_sw.WriteLine(line);
}
}