【发布时间】:2018-11-27 08:32:08
【问题描述】:
我们正在从 EVE Online API 中提取大量 JSON 对象,并使用 Newtonsoft.Json.JsonConvert 将它们反序列化为 EveObjModel 对象。从那里我们想要创建一个唯一对象列表,即每个 type_id 中最昂贵的。我也粘贴了下面的 dataContract。
问题:下面的代码可以处理较小的数据集,但它不适用于大量数据。目前,我们正在运行它,它需要 50 多分钟(并且还在计数)。我们可以做些什么来减少运行更大的数据集所需的时间到可以接受的水平?
感谢您的宝贵时间。手指交叉。
// The buyList contains about 93,000 objects.
public void CreateUniqueBuyList(List<EveObjModel> buyList)
{
List<EveObjModel> uniqueBuyList = new List<EveObjModel>();
foreach (EveObjModel obj in buyList)
{
int duplicateCount = 0;
for (int i = 0; i < uniqueBuyList.Count; i++)
{
if (uniqueBuyList[i].type_id == obj.type_id)
duplicateCount++;
}
if (duplicateCount == 1)
{
foreach (EveObjModel objinUnique in uniqueBuyList)
{
if (obj.type_id == objinUnique.type_id && obj.price > objinUnique.price)
{
// instead of adding obj, the price is just changed to the price in the obj.
objinUnique.price = obj.price;
}
else if (obj.type_id == objinUnique.type_id && obj.price == objinUnique.price)
{
//uniqueBuyList.RemoveAll(item => item.type_id == obj.type_id);
}
else
{
// Hitting this mean that there are other objects with same type and higher price OR its not the same type_id
}
}
}
else if (duplicateCount > 1)
{
// shud not happn...
}
else
{
uniqueBuyList.Add(obj);
}
continue;
}
foreach (EveObjModel item in uniqueBuyList.OrderBy(item => item.type_id))
{
buyListtextField.Text += $"Eve Online Item! Type-ID is: {item.type_id}, Price is {item.price}\n";
}
}
这是我们的 EveObjModel 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace EveOnlineApp
{
[DataContract]
public class EveObjModel
{
[DataMember]
public bool is_buy_order { get; set; }
[DataMember]
public double price { get; set; }
[DataMember]
public int type_id { get; set; }
}
}
【问题讨论】:
-
耗时长的部分是什么?对象有多大?下载近 94,000 个对象可能需要一段时间(取决于它们的大小)
-
@MindSwipe 下载对象大约需要 2.5 分钟。我们也将不得不对此进行调查,但上述问题仍占运行时间的 99% 以上。感谢您的宝贵时间。
标签: c# algorithm json.net runtime