は、次のコンソールアプリケーションを使用して:ログファイルを解析し、ファイルへの書き込み、その後、静かに停止を書き込み、入力ファイルのキューが反復を続け
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Configuration;
namespace ConsoleApp1
{
class Program
{
static StringBuilder sBuilder = new StringBuilder();
static StreamWriter file;
static void Main(string[] args)
{
try
{
using (file = new StreamWriter(ConfigurationManager.AppSettings["outFile"], true))
{
ProcessDirectory(ConfigurationManager.AppSettings["inDir"]);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
File.WriteAllText(ConfigurationManager.AppSettings["logFile"], ex.Message);
throw;
}
}
public static void ProcessDirectory(string targetDirectory)
{
string[] fileEntries = Directory.GetFiles(targetDirectory);
foreach (string fileName in fileEntries)
ProcessFile(fileName);
string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory);
}
public static void ProcessFile(string path)
{
var lines = File.ReadAllLines(path);
var filtered = lines
.Where(x => x[0] != '#')
.Select(line => line.Split(' '))
.Where(fields =>
fields[8] != '-' // and other filtering
)
.Select(f => string.Join(" ", new string[] {
f[0],
f[8].ToLower().Replace("some_value",""),
((some_contextual_condition || another_contextual_condition)? "1" : "0")
}
))
.Distinct();
var sBuilder = new StringBuilder();
filtered
.ToList()
.ForEach(f =>
{
sBuilder.AppendLine(f);
});
file.Write(sBuilder.ToString());
}
}
}
入力の約3500のファイルが340 GB単位の合計があります。 約400のファイルと約200の書き込み操作を処理した後、出力ファイルには何も書き込まれません。
私は、静的なクラスプロパティとして、またはProcessFileメソッドでローカルスコープの変数としてStringBuilderを使用して、行ごとに記述しようとしています。
実行中のコンソールアプリケーションで添付されたイメージ。ファイル380が処理されるまでに、出力ファイルのサイズは〜まで増加しなくなりました。試してみてください...すべてのメインメソッドのコンテンツを埋め込むことは何も捕らえません。
@Evk、これは私の第nのアプローチです。私は各繰り返しの後にフィルタリングされた値を書きました(最大1.8MB)。 –
そして、現在の実装の最後にすべてが書かれていれば、何も400ファイルの後に出力するよう書かれていないことをどうお知りになりますか?それはStreamWriterを使った別のアプローチですか?デバッガの下で実行して、正確にどこがハングしているのか確認しましたか? – Evk
出力するように書き込まれるバイト数と行数を書きました。しばらくしてから〜15分後に、これらのカウンタは増加を停止します。しかし、私はまだファイルがコンソール出力で取得されていることがわかります。 –