인터넷에서 데이터를 다운로드하고 데이터베이스에 저장하는 메서드를 작성했습니다. 필자는 PLINQ를 사용하여 멀티 코어 프로세서를 활용하고 매우 짧은 기간에 수천 개의 서로 다른 파일을 다운로드하기 때문에이를 작성했습니다. 아래 코드를 주석에 추가하여 프로그램이 멈추는 위치를 보여 주지만 프로그램이 거기에 앉아 잠시 후 메모리 부족 문제가 발생합니다. 이것은 TPL과 PLINQ를 처음 사용하는 것이므로 극도로 혼란스러워서 이것을 해결하기 위해해야 할 일에 대한 조언을 할 수 있습니다.처음으로 병렬 linq를 사용하고 메모리 부족 예외가 발생하는 메서드를 만드는 중
업데이트 : 웹 클라이언트가 시간 초과되어 끊임없이 웹 예외가 발생한다는 것을 알았습니다. this answer here에 따라 최대 연결 수를 늘려이 문제를 해결했습니다. 그런 다음 연결이 열리지 않는 예외를 얻었으며 this answer here을 사용하여 해결했습니다. 지금은 로컬 SQL 서버이지만 데이터베이스에 대한 연결 시간 초과 오류가 발생합니다. 그들은 기적으로 완료되지 않지만 그들은 작업을 반환 : 나는 아직도 내가 완전히
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();
}
}
);
}
너무 많은 코드. 특히 적중하지 않은 것으로 표시된 코드는 삭제하십시오. – usr
@usr 읽기 쉽도록 코드를 삭제했지만 더 이상 삭제할 수 없습니다. 나는 분명히 내 이슈의 전체 초점이기 때문에 결코 치지 않는 코드를 삭제할 수 없다. – user3610374