我正在使用websocket连接到第三方数据提要提供商的服务器。 对于websocket连接,我的代码是:
this.websocket = new WebSocket("wss://socket.polygon.io/stocks", sslProtocols: SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls);
因此,建立连接后,我们每分钟将收到近70,000至1,00,000条记录。因此,在此之后,我们将这些响应分为两部分,并将其存储在单独的文件中。就像我们收到AAPL的数据一样,我们也将这些数据存储到AAPL的文件中。与FB,MSFT,IBM,QQQ等相同。我们总共需要处理10,000个文件,并根据它存储实时记录。
public static string tempFile = @"D:\TempFileForLiveMarket\tempFileStoreLiveSymbols.txt";
public static System.IO.StreamWriter w;
private void websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
{
using (w = System.IO.File.AppendText(tempFile))
{
Log(e.Message, w);
}
using (System.IO.StreamReader r = System.IO.File.OpenText(tempFile))
{
DumpLog(r);
}
}
public static void Log(string responseMessage, System.IO.TextWriter w)
{
w.WriteLine(responseMessage);
}
public static void DumpLog(System.IO.StreamReader r)
{
string line;
while ((line = r.ReadLine()) != null)
{
WriteRecord(line);
}
}
public static void WriteRecord(string data)
{
List<LiveData> ld = JsonConvert.DeserializeObject<List<LiveData>>(data);
var filterData = ld.Where(x => symbolList.Contains(x.sym));
List<string> fileLines = new List<string>();
foreach (var item in filterData)
{
var fileName = @"D:\SymbolsData\"+item.sym+ "_day_Aggregate.txt";
fileLines = File.ReadAllLines(fileName).AsParallel().Skip(1).ToList();
if (fileLines.Count > 1)
{
var lastLine = fileLines.Last();
if (!lastLine.Contains(item.sym))
{
fileLines.RemoveAt(fileLines.Count - 1);
}
}
fileLines.Add(item.sym + "," + item.s + "," + item.p + "-----");
System.IO.File.WriteAllLines(fileName, fileLines);
}
}
因此,当建立websocket连接并使用我们的10,000个文件对实时市场数据执行操作时,它会变得越来越慢,并且几分钟后传递websocket连接也会关闭,并传递如下消息:
Websocket Error
Received an unexpected EOF or 0 bytes from the transport stream.
Connection Closed...
我正在执行整个过程,因为在下一阶段,我需要对每个符号的实时价格进行技术分析。那么我该如何处理这种情况呢?如何使处理速度快于此处理速度?怎样停止连接?
编辑后
我用String Builder替换流编写器和临时文件,如下所示,
public static StringBuilder sb = new StringBuilder();
public static System.IO.StringWriter sw;
private void websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
{
sw = new System.IO.StringWriter(sb);
sw.WriteLine(e.Message);
Reader();
}
public static void Reader()
{
System.IO.StringReader _sr = new System.IO.StringReader(sb.ToString());
while (_sr.Peek() > -1)
{
WriteRecord(sb.ToString());
}
sb.Remove(0, sb.Length);
}
public static void WriteRecord(string data)
{
List<LiveData> ld = JsonConvert.DeserializeObject<List<LiveData>>(data);
foreach (var item in filterData)
{
var fileName = @"D:\SymbolsData\"+item.sym+ "_day_Aggregate.txt";
fileLines = File.ReadAllLines(fileName).AsParallel().Skip(1).ToList();
fileLines.RemoveAt(fileLines.Count - 1);
fileLines.Add(item.sym + "," + item.s + "," + item.p)
System.IO.File.WriteAllLines(fileName, fileLines);
}
}
答案 0 :(得分:1)
似乎您将每个消息附加到tempFile
,但是随后您要处理整个 tempFile
。这意味着您将不断地重新处理旧数据 plus 新记录,因此,是的:它将逐渐花费越来越长的时间,直到花费很长的时间才能使另一个记录结束无聊的等待,并切断您。我的建议:不要那样。
还有很多 事情,您可以在实际处理每条记录时更高效地完成,但是与不断重新处理一切的开销相比,这无关紧要。