Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中快速处理和执行websocket数据操作?_C#_Linq_Sockets_Websocket_Filestream - Fatal编程技术网

如何在c#中快速处理和执行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条记录。因此,在这之后,我们将这些响应分开,并将其

我正在使用websocket连接到第三方数据源提供商的服务器。 对于websocket连接,我的代码是:

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);
      }
}