Open XML SDKを使用してカスタマイズしたコードでXLSXファイルを作成しています。 200列の50000レコード、最大13 GBのRAMを使用しています。XLSXファイルを作成して100000レコードに時間をとり、最大RAMメモリを使用する
しかし、私は100000行と200列の最大16 GBのRAMを使っていましたが、XLSXファイルを作成せず、RAMメモリの増減を続け、CPU使用量を増減しました。
私はStreamに100000行200列を書き込んで、XMLファイルを分割することなく同時にストリームをPackage Part Streamにコピーしています。そのXMLファイルのサイズは3 GBです。
Open XML SDKを使用してこれを解決することができますか?
私は、シングルユーザー用に200列の100000レコードで動作するOpen XMLを試してみました。しかし、2人のユーザーのために200列の100000レコードを作成すると、サーバーがハングしています。
私のカスタマイズされたコードはRAMを増やしていますが、ハングしません。
以下のコードでは、 "CreateOpenXMLComWorkSheet_XMLWriter"メソッドがRAMサイズを増やしています。
私はあなたの参照のために以下のコードを使用しています。変更が必要な場合はお知らせください。
//Package method
Package package = null;
using (package = ZipPackage.Open(path, FileMode.Create))
{
packgPart = package.CreatePart(new Uri(relativePaths[relIndex], UriKind.Relative), contentTypes[6], CompressionOption.Maximum);
XmlWriter xmlWriter;
Stream stream = CreateOpenXMLComWorkSheet_XMLWriter(data, "", out xmlWriter);
CopyStream(stream, packgPart.GetStream());
xmlWriter.Flush();
xmlWriter.Close();
xmlWriter = null;
package.Flush();
packgPart = null;
stream.Close();
stream.Dispose();
stream = null;
relIndex++;
GC.Collect();
package.Close();
}
// CreateOpenXMLComWorkSheet method
// Define other methods and classes here
private static Stream CreateOpenXMLComWorkSheet_XMLWriter(List<StringBuilder> rows, string sheet,out XmlWriter xmlWriter)
{
string[] cols;
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.NewLineHandling = NewLineHandling.None;
xmlWriterSettings.Indent = false;
xmlWriter = null;
MemoryStream stream = new MemoryStream();
string nameSpace = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
xmlWriter = XmlWriter.Create(stream,xmlWriterSettings);
xmlWriter.WriteStartElement("x","worksheet",nameSpace);
xmlWriter.WriteStartElement("x","sheetData",nameSpace);
for (m = 0; m < rows.Count; m++)
{
xmlWriter.WriteStartElement("x","row",nameSpace);
cols = rows[m].ToString().Split(new string[] { univDelimiter }, StringSplitOptions.None);
for (int i = 1; i <= cols.Length; i++)
{
cellValue = cols[i - 1];
if (double.TryParse(cellValue,out dVal))
{
dataType = "n";
}
else
{
dataType = "str";
}
xmlWriter.WriteStartElement("x","c",nameSpace);
xmlWriter.WriteAttributeString("s", "13");
xmlWriter.WriteAttributeString("t", dataType);
xmlWriter.WriteStartElement("x", "v",nameSpace);
xmlWriter.WriteValue(cellValue);
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
}
xmlWriter.WriteEndElement();
rows[m] = null;
}
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.Flush();
stream.Position = 0;
return stream;
}
//CopyStream method
private static void CopyStream(Stream source, Stream target)
{
const int bufSize = 0x1000;
byte[] buf = new byte[bufSize];
int bytesRead = 0;
while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
target.Write(buf, 0, bytesRead);
}
別のスレッドや 'async'の' Task'でファイルを作成してサーバーがハングしないようにできますか? – mcy
あなたはepplusを試しましたか? –
'CompressionOption.Maximum'は最も遅いものなので、比較のために' CompressionOption.Fast'を試すことができます – Slai