將字串轉換為位元組陣列時出現記憶體不足例外。
if (message.Contains("REQZ1S"))
{
string strMsg = "REQZID;";
try
{
var tmp = LoadCellService.readFromExcel(LoadCellModel.LoadCellRowList.Where(x => x.Stage == 1).ToList(), 1);
LogHelper.StartTo(nameof(LoadCellSiemensOPCModel), $"tmp count: {tmp.Item1.Count}");
if (tmp.Item1 != null)
{
tmp.Item1.ForEach(
z => LoadCellModel.LoadCellRowList.Where(x => x.Stage == z.Stage && x.RowIndex == z.RowIndex).First().LoadCellRowColumnList = z.LoadCellRowColumnList
);
LoadCellModel.LoadCellRowList.ForEach(
x => x.LoadCellRowColumnList.ForEach(y =>
{
LogHelper.StartTo("temp", y.LoadCellRowColumnKey ";" y.LoadCellRowColumnValue);
if (y.LoadCellRowColumnKey == "Distance")
{
strMsg = strMsg ";" y.LoadCellRowColumnValue;
}
})
);
LogHelper.KeyValue(nameof(LoadCellSiemensOPCModel), "message2", strMsg);
byte[] msg = System.Text.Encoding.ASCII.GetBytes(strMsg "\r");
Stream.Write(msg, 0, msg.Length);
LogHelper.KeyValue(nameof(LoadCellSiemensOPCModel), "message", strMsg);
LogHelper.SiemensOPCTrace(nameof(LoadCellSiemensOPCModel), $"Write <<< {strMsg}");
}
else
{
byte[] msg = System.Text.Encoding.ASCII.GetBytes("REQZ1E;\r");
Stream.Write(msg, 0, msg.Length);
LogHelper.SiemensOPCTrace(nameof(LoadCellSiemensOPCModel), $"Write <<< REQZ1E;");
}
LogHelper.Done(nameof(LoadCellSiemensOPCModel), $"Write <<< REQZ1S;");
}
catch (Exception EX)
{
LogHelper.KeyValue(nameof(LoadCellSiemensOPCModel), "message1", strMsg);
LogHelper.Error("TEMP", EX);
}
}
我懷疑需要在這部分添加一些適當的邏輯:
byte[] msg = System.Text.Encoding.ASCII.GetBytes(strMsg "\r");
Stream.Write(msg, 0, msg.Length);
uj5u.com熱心網友回復:
問題不是 System.Text.Encoding.ASCII.GetBytes("REQZ1E;\r");- 問題在這里:
LoadCellModel.LoadCellRowList.ForEach(
x => x.LoadCellRowColumnList.ForEach(y => {
// ...
strMsg = strMsg ";" y.LoadCellRowColumnValue;
// ...
}
使用 =運算子連接字串會導致整個字串的完整復制和重新分配。
因此,舉例來說,如果你有一個回圈迭代100次(10*x和10*y100個),并在每次迭代中它增加了50個字符的字串(所以最終的輸出長度為5000個字符),但它也拷貝一切全一遍,所以一旦你超過了,比如說,1000 個字符,計算機現在每次都必須復制一整千位元組 - 你也通過復制 999、998、997、996 等字符到達那里 - 運行時的復雜性非常糟糕(的順序O(n^2))。
你可以這樣做:
- (為簡潔起見省略了外部
if、try/catch陳述句和Logging呼叫) - 我看到您正在寫入 a
Stream,因此請使用StreamWriter具有所需編碼集的 a 。 - 我
.ForEach用foreach宣告代替了你的電話。
var tmp = LoadCellService.readFromExcel( LoadCellModel.LoadCellRowList.Where(x => x.Stage == 1 ).ToList() , 1 );
if (tmp.Item1 != null)
{
// This can be further optimized by loading `LoadCellModel.LoadCellRowList` into a dictionary by an appropriate key.
foreach( var z in tmp.Item1 )
{
var columnList = LoadCellModel.LoadCellRowList
.Where( x =>
x.Stage == z.Stage &&
x.RowIndex == z.RowIndex
)
.First();
columnList.LoadCellRowColumnList = z.LoadCellRowColumnList;
}
using( StreamWriter wtr = new StreamWriter( stream, Encoding.ASCII ) )
{
foreach( var x in LoadCellModel.LoadCellRowList )
{
foreach( var y in x.LoadCellRowColumnList.Where( yc => yc.LoadCellRowColumnKey == "Distance" ) )
{
wtr.Write( ';' );
wtr.Write( y.LoadCellRowColumnValue );
}
}
wtr.Flush();
}
}
else
{
byte[] msg = Encoding.ASCII.GetBytes("REQZ1E;\r");
stream.Write(msg, 0, msg.Length);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346730.html
下一篇:驗證字典值
