Я хочу рассчитать оптимальное резервирование.
Когда я делаю это на PL/SQL, это очень медленно и дорого. Поэтому я пытаюсь использовать LINQ. У меня две коллекции, заказы и запасы. Но это тоже очень медленно. мне недостаточно быстро.
Я не могу использовать скомпилированный запрос. Я не могу использовать индекс Data Dictionary (я не работаю с уникальными данными). AsParallel()
не сработало (по крайней мере, у меня).
Как улучшить производительность кода?
var orders = deserialize<Order>(@"C:\orders.bin");
var stocks = deserialize<Stock>(@"C:\Stocks.bin");
for (int i = 0; i < 1000; i++)
{
var order1 = (from p in orders
where p.QTY_DEMAND > 0
group p by new { p.OUTER_GROUP_ID, p.ORG_CODE, p.ARTICLE_CODE, p.FROM_ACCOUNTNO, p.AVAILABILITY_STATE } into g
select new
{
OUTER_GROUP_ID = g.Key.OUTER_GROUP_ID,
ORG_CODE = g.Key.ORG_CODE,
Article_code = g.Key.ARTICLE_CODE,
FROM_ACCOUNTNO = g.Key.FROM_ACCOUNTNO,
AVAILABILITY_STATE = g.Key.AVAILABILITY_STATE,
QUANTITY = g.Sum(p => p.QTY_DEMAND)
});
var order2 = from p in order1
join vw1 in stocks on new { org_code = p.ORG_CODE, article_code = p.Article_code, account_no = p.FROM_ACCOUNTNO, av_state = p.AVAILABILITY_STATE }
equals new { org_code = vw1.ORG_CODE, article_code = vw1.ARTICLE_CODE, account_no = vw1.ACCOUNTNO, av_state = vw1.AVAILABILITY_STATE }
where vw1.QTY_STOCK > 0
group new { p, o = vw1 } by new { baseValue, vw1.LOCATION_TYPE, vw1.PLACE_TYPE, p.Article_code, p.QUANTITY, vw1.STANDS_ON_THM } into g
let SumQTY_STOCK = g.Sum(o => o.o.QTY_STOCK)
select new
{
BASE_VALUE = g.Key.baseValue,
g.Key.Article_code,
...
}
var order3 = from p in order2
group p by new { p.BASE_VALUE, p.LOCATION_TYPE, p.PLACE_TYPE } into g
select new
{
...
}
var order4 = from a in order3
...
foreach (var item in order4)
{
//doing somethings
}
}
public List<T> deserialize<T>(string path)
{
using (var file = File.OpenRead(path))
{
BinaryFormatter ser = new BinaryFormatter();
return (List<T>)ser.Deserialize(file);
}
}
Parallel.For
, а неfor
, если вы работаете на › 1 процессоре. 02.02.2015IEnumerable
илиIQueryable
), то это ничего не изменит. 02.02.2015