如何在c#中快速处理和执行websocket数据操作?
我正在使用websocket连接到第三方数据源提供商的服务器。 对于websocket连接,我的代码是:如何在c#中快速处理和执行websocket数据操作?,c#,linq,sockets,websocket,filestream,C#,Linq,Sockets,Websocket,Filestream,我正在使用websocket连接到第三方数据源提供商的服务器。 对于websocket连接,我的代码是: this.websocket = new WebSocket("wss://socket.polygon.io/stocks", sslProtocols: SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls); 因此,当连接建立后,我们每分钟会收到近70000到100000条记录。因此,在这之后,我们将这些响应分开,并将其
this.websocket = new WebSocket("wss://socket.polygon.io/stocks", sslProtocols: SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls);
因此,当连接建立后,我们每分钟会收到近70000到100000条记录。因此,在这之后,我们将这些响应分开,并将其存储在单独的文件中。比如,如果我们接收到AAPL的数据,那么我们将该数据存储到AAPL的文件中。与FB、MSFT、IBM、QQQ等相同。我们总共有10000个文件需要一次处理,并根据它存储实时记录
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);
}
}
我正在执行整个过程,因为在下一阶段,我需要对每个符号的实时价格进行技术分析。那么我该如何处理这种情况呢?如何使处理速度快于此处理速度?我怎样才能停止连接关闭
编辑后
我用字符串生成器替换流编写器和临时文件,如下所示
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);
}
}
publicstaticstringbuilder sb=newstringbuilder();
公共静态系统IO.StringWriter sw;
私有void websocket_MessageReceived(对象发送方,MessageReceivedEventArgs e)
{
sw=新系统IO.StringWriter(sb);
sw.WriteLine(e.Message);
读取器();
}
公共静态void读取器()
{
System.IO.StringReader _sr=新的System.IO.StringReader(sb.ToString());
而(_sr.Peek()>-1)
{
书面记录(某人写的);
}
sb.删除(0,sb.长度);
}
公共静态void WriteRecord(字符串数据)
{
List ld=JsonConvert.DeserializeObject(数据);
foreach(filterData中的变量项)
{
var fileName=@“D:\symboldata\”+item.sym+“\u day\u Aggregate.txt”;
fileLines=File.ReadAllLines(fileName).AsParallel().Skip(1).ToList();
fileLines.RemoveAt(fileLines.Count-1);
添加(item.sym+“,“+item.s+”,“+item.p”)
System.IO.File.writeAllines(文件名、文件行);
}
}
看起来像是将每条消息附加到临时文件
,然后处理整个临时文件
。这意味着您不断地重新处理旧数据和新记录,因此是的:它将逐渐花费越来越长的时间,直到它花费如此长的时间,以至于另一端厌倦了等待,并切断您的连接。我的建议是:不要那样做
在实际处理每条记录的过程中,还有很多事情可以做得更有效,但与不断重新处理所有内容的开销相比,这是无关紧要的。无论你做什么,写入文件都会很慢。也许可以缓冲消息,然后稍后再写入它们-这样可以避免使用文件io@PatrickHollweck是的,也可以将实时数据存储到临时文件中,并为每1分钟设置一次计时器,这将每1分钟从临时文件收集数据,然后对其进行处理。但如果可能,使用实时数据,则最好使用实时价格。在我们的选择中,它将根据延迟1分钟的价格数据进行处理。所以我首先推荐这个选项。将数据保存到数据库中比保存到大文件更快。像SQL Server这样的数据库设计用于处理实时数据存储。打开文件时会占用大量内存。当您附加到一个文件时,在windows中打开并移动到文件末尾需要花费很长时间。随着文件大小越来越大,移动到结束的时间也越来越长。@jdweng,是的,这更好,但我正在处理每个符号的日数据、分钟数据、报价数据和交易数据,每个部分处理近25000条记录。因此,对于每个符号,将有1个lac记录。我总共会有10669个文件。所以可能是这种类型,非常大的数据在任何数据库上都很难处理,所以我尝试使用内存映射文件。内存映射永远不会工作。数据库设计用于处理大量数据。看起来你只有2.5亿张唱片。如果你把数据放入一个巨大的文件中,读取文件需要多长时间?大内存映射最终会导致数据在驱动器上的交换空间非常慢。感谢您的宝贵建议。如果我们使用StringBuilder,那么它会影响进程而不是StreamWrite和tempfile吗?@Ankit认为。。。这不是重点;关键是,您当前正在创建和重新处理一个越来越大的文件;现在是的,显然,如果您不接触文件系统,速度会更快,但您可能希望文件系统上的数据。问题是你一直在重新处理一切。所以不要这样做?我们的WriteRecord方法无法将每个响应写入特定的符号文件。我们每分钟收到80000条记录,我们有10000个符号文件。所以响应速度非常快,将所有记录写入文件的速度非常慢。所以tempfile的主要目的是,若符号文件中的记录写入速度变慢,那个么我们就不能丢失它。我们可以从tempfile中收集它。但若我们可以在符号文件中获得非常高的写响应速度,那个么我们也不需要tempfile和stringbuilder。那个么,有并没有办法让WriteRecord方法中的进程非常快呢?
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);
}
}