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# 第一次创建一个使用并行linq和内存溢出异常的方法_C#_Linq_Task Parallel Library_Plinq_Parallel.foreach - Fatal编程技术网

C# 第一次创建一个使用并行linq和内存溢出异常的方法

C# 第一次创建一个使用并行linq和内存溢出异常的方法,c#,linq,task-parallel-library,plinq,parallel.foreach,C#,Linq,Task Parallel Library,Plinq,Parallel.foreach,我写了一个从互联网下载数据并保存到数据库的方法。我用PLINQ写这篇文章是为了利用我的多核处理器,因为它在很短的时间内下载了数千个不同的文件。我在下面的代码中添加了注释,以显示程序停止的位置,但程序只是停留在那里,过了一段时间,我得到一个内存不足异常。这是我第一次使用TPL和PLINQ,我非常困惑,所以我真的需要一些建议来解决这个问题 更新:我发现我经常收到一个webexception,因为webclient超时了。我修复了这个问题,根据需要增加连接的最大数量。然后,我得到了连接未打开的异常,我

我写了一个从互联网下载数据并保存到数据库的方法。我用PLINQ写这篇文章是为了利用我的多核处理器,因为它在很短的时间内下载了数千个不同的文件。我在下面的代码中添加了注释,以显示程序停止的位置,但程序只是停留在那里,过了一段时间,我得到一个内存不足异常。这是我第一次使用TPL和PLINQ,我非常困惑,所以我真的需要一些建议来解决这个问题

更新:我发现我经常收到一个webexception,因为webclient超时了。我修复了这个问题,根据需要增加连接的最大数量。然后,我得到了连接未打开的异常,我通过使用修复了它。现在,即使数据库是本地sql server,也会出现连接超时错误。我仍然无法运行任何代码,因此我完全可以使用一些建议

static void Main(string[] args)
    {
        try
        {
            while (true)
            {
                // start the download process for market info
                startDownload();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }
    }

    public static void startDownload()
    {
        DateTime currentDay = DateTime.Now;
        List<Task> taskList = new List<Task>();

        if (Helper.holidays.Contains(currentDay) == false)
        {
            List<string> markets = new List<string>() { "amex", "nasdaq", "nyse", "global" };

            Parallel.ForEach(markets, market =>
            {
                Downloads.startInitialMarketSymbolsDownload(market);
            }
            );

            Console.WriteLine("All downloads finished!");
        }

        // wait 24 hours before you do this again
        Task.Delay(TimeSpan.FromHours(24)).Wait();
    }

public static void startInitialMarketSymbolsDownload(string market)
    {
        try
        {
            List<string> symbolList = new List<string>();
            symbolList = Helper.getStockSymbols(market);

            var historicalGroups = symbolList.AsParallel().Select((x, i) => new { x, i })
                      .GroupBy(x => x.i / 100)
                      .Select(g => g.Select(x => x.x).ToArray());

            historicalGroups.AsParallel().ForAll(g => getHistoricalStockData(g, market));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }
    }

public static void getHistoricalStockData(string[] symbols, string market)
    {
        // download data for list of symbols and then upload to db tables
        Uri uri;
        string url, line;
        decimal open = 0, high = 0, low = 0, close = 0, adjClose = 0;
        DateTime date;
        Int64 volume = 0;
        string[] lineArray;
        List<string> symbolError = new List<string>();
        Dictionary<string, string> badNameError = new Dictionary<string, string>();

        Parallel.ForEach(symbols, symbol =>
                {
                        url = "http://ichart.finance.yahoo.com/table.csv?s=" + symbol + "&a=00&b=1&c=1900&d=" + (DateTime.Now.Month - 1) + "&e=" + DateTime.Now.Day + "&f=" + DateTime.Now.Year + "&g=d&ignore=.csv";
                        uri = new Uri(url);

                        using (dbEntities entity = new dbEntities())
                        using (WebClient client = new WebClient())
                        using (Stream stream = client.OpenRead(uri))
                        using (StreamReader reader = new StreamReader(stream))
                        {
                            while (reader.EndOfStream == false)
                            {
                                line = reader.ReadLine();
                                lineArray = line.Split(',');

                                // if it isn't the very first line
                                if (lineArray[0] != "Date")
                                {
                                    // set the data for each array here
                                    date = Helper.parseDateTime(lineArray[0]);
                                    open = Helper.parseDecimal(lineArray[1]);
                                    high = Helper.parseDecimal(lineArray[2]);
                                    low = Helper.parseDecimal(lineArray[3]);
                                    close = Helper.parseDecimal(lineArray[4]);
                                    volume = Helper.parseInt(lineArray[5]);
                                    adjClose = Helper.parseDecimal(lineArray[6]);

                                    switch (market)
                                    {
                                        case "nasdaq":
                                            DailyNasdaqData nasdaqData = new DailyNasdaqData();
                                            var nasdaqQuery = from r in entity.DailyNasdaqDatas.AsParallel().AsEnumerable()
                                                              where r.Date == date
                                                              select new StockData { Close = r.AdjustedClose };

                                            List<StockData> nasdaqResult = nasdaqQuery.AsParallel().ToList(); // hits this line
                                            break;
                                        default:
                                            break;
                                    }
                                }
                            }

                            // now save everything
                            entity.SaveChanges();
                        }
                }
        );
    }
static void Main(字符串[]args)
{
尝试
{
while(true)
{
//启动市场信息的下载过程
startDownload();
}
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
控制台写入线(例如StackTrace);
}
}
公共静态无效开始下载()
{
DateTime currentDay=DateTime.Now;
List taskList=新列表();
if(Helper.holidays.Contains(currentDay)=false)
{
上市市场=新上市{“美国运通”、“纳斯达克”、“纽约证券交易所”、“全球”};
Parallel.ForEach(市场,市场=>
{
下载。StartinitialMarketSymbols下载(市场);
}
);
WriteLine(“所有下载完成!”);
}
//请等待24小时,然后再执行此操作
Task.Delay(TimeSpan.FromHours(24)).Wait();
}
公共静态无效开始TinitialMarketSymbols下载(字符串市场)
{
尝试
{
列表符号列表=新列表();
symbolList=Helper.getStockSymbols(市场);
var historicalGroups=symbolList.AsParallel().Select((x,i)=>new{x,i})
.GroupBy(x=>x.i/100)
.Select(g=>g.Select(x=>x.x).ToArray());
AsParallel().ForAll(g=>getHistoricalStockData(g,market));
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
控制台写入线(例如StackTrace);
}
}
公共静态无效getHistoricalStockData(字符串[]符号,字符串市场)
{
//下载符号列表的数据,然后上载到db表
Uri;
字符串url,行;
十进制打开=0,高=0,低=0,关闭=0,调整关闭=0;
日期时间日期;
Int64卷=0;
字符串[]线性排列;
列表symbolError=新列表();
Dictionary badNameError=新建字典();
Parallel.ForEach(符号,符号=>
{
url=”http://ichart.finance.yahoo.com/table.csv?s=“+symbol+”&a=00&b=1&c=1900&d=“+(DateTime.Now.Month-1)+”&e=“+DateTime.Now.Day+”&f=“+DateTime.Now.Year+”&g=d&ignore=.csv”;
uri=新的uri(url);
使用(dbEntities entity=new dbEntities())
使用(WebClient=newWebClient())
使用(Stream=client.OpenRead(uri))
使用(StreamReader=新StreamReader(stream))
{
while(reader.EndOfStream==false)
{
line=reader.ReadLine();
lineArray=直线分割(',');
//如果不是第一行的话
如果(线性阵列[0]!=“日期”)
{
//在此处设置每个数组的数据
date=Helper.parseDateTime(lineArray[0]);
open=Helper.parseDecimal(lineArray[1]);
high=Helper.parseDecimal(lineArray[2]);
low=Helper.parseDecimal(lineArray[3]);
close=Helper.parseDecimal(lineArray[4]);
volume=Helper.parseInt(lineArray[5]);
adjClose=Helper.parseDecimal(lineArray[6]);
交换机(市场)
{
案例“纳斯达克”:
DailyNasdaqData nasdaqData=新的DailyNasdaqData();
var nasdaqQuery=来自entity.dailynasdaqdata.AsParallel().AsEnumerable()中的r
其中r.Date==日期
选择new StockData{Close=r.AdjustedClose};
List nasdaqResult=nasdaqQuery.AsParallel().ToList();//点击此行
打破
违约:
打破
}
}
}
//现在保存一切
entity.SaveChanges();
}
}
);
}

异步lambda在一个方面与异步方法类似:它们不同步完成,但返回任务。在并行循环中