zipファイルから情報を抽出する方法を作っています。すべてのzipファイルには1つのテキストファイルのみが含まれます。メソッドが文字列配列を返すことを目的としています。
dotnetzipを使用していますが、ひどいパフォーマンスが発生しています。各ステップのパフォーマンスをベンチマークしようとしましたが、すべてのステップでパフォーマンスが遅いようです。
c#コードは次のとおりです。
public string[] LoadZipFile(string FileName)
{
string[] lines = { };
int start = System.Environment.TickCount;
this.richTextBoxLOG.AppendText("Reading " + FileName + "... ");
try
{
int nstart;
nstart = System.Environment.TickCount;
ZipFile zip = ZipFile.Read(FileName);
this.richTextBoxLOG.AppendText(String.Format("ZipFile ({0}ms)\n", System.Environment.TickCount - nstart));
nstart = System.Environment.TickCount;
MemoryStream ms = new MemoryStream();
this.richTextBoxLOG.AppendText(String.Format("Memorystream ({0}ms)\n", System.Environment.TickCount - nstart));
nstart = System.Environment.TickCount;
zip[0].Extract(ms);
this.richTextBoxLOG.AppendText(String.Format("Extract ({0}ms)\n", System.Environment.TickCount - nstart));
nstart = System.Environment.TickCount;
string filecontents = string.Empty;
using (var reader = new StreamReader(ms))
{
reader.BaseStream.Seek(0, SeekOrigin.Begin);
filecontents = reader.ReadToEnd().ToString();
}
this.richTextBoxLOG.AppendText(String.Format("Read ({0}ms)\n", System.Environment.TickCount - nstart));
nstart = System.Environment.TickCount;
lines = filecontents.Replace("\r\n", "\n").Split("\n".ToCharArray());
this.richTextBoxLOG.AppendText(String.Format("SplitLines ({0}ms)\n", System.Environment.TickCount - nstart));
}
catch (IOException ex)
{
this.richTextBoxLOG.AppendText(ex.Message+ "\n");
}
int slut = System.Environment.TickCount;
this.richTextBoxLOG.AppendText(String.Format("Done ({0}ms)\n", slut - start));
return (lines);
例として、次の出力を取得します。
xxxx.zipを読み取っています...ZipFile(0ms)メモリストリーム(0ms)抽出(234ms)読み取り(78ms)SplitLines(187ms)完了(514ms)
合計514ミリ秒。このコードを使用してPython2.6で同じ操作を実行すると、次のようになります。
def ReadZip(File):
z = zipfile.ZipFile(File, "r")
name =z.namelist()[0]
return(z.read(name).split('\r\n'))
わずか89ミリ秒で実行されます。パフォーマンスを改善する方法についてのアイデアは大歓迎です。