C#使用Json对许多文件进行重复评估

时间:2017-11-09 07:51:57

标签: c# json algorithm performance bigdata

我编写了一个算法来评估很多Json-Files(平均50个文件,每个文件平均有9mb),这个评估重复138次。
首先将数据写入一个大的500mb jsonfile,然后将其拆分为这些小文件以处理数据。我正在使用JSON.NET。
读取文件根本不耗费时间,但将它们解析为JObject,平均花费1.5秒。我正在阅读50个文件138次,这意味着即时阅读文件6900次 一次运行平均需要4-5个小时,这是很多时间,我没有的时间......

为了演示这个算法正在做什么,想象一下有138个独特的玩家,他们都玩了50.000个游戏。现在你有这5000个游戏并且想要评估每个玩家的平均值。现在你必须为每个玩家完成这50个文件,当它完成后,将值写入文件并开始下一个玩家评估。每次评估大约需要1,2-2GB ram,因为我的算法使用函数来填充列表,添加值,计算平均值等。计算本身很快,目前不需要改进,我每次更新代码创造更快的体验。

并行性用于从API收集数据,效果很好,但是在评估的情况下它不能使用,因为文件在处理时被锁定,它会占用很多内存等。

所以我的问题是,是否有任何技术可以比现在更快地处理它?处理平均6900个文件重复似乎不好的做法和错误,我想我错过了一些东西......

提前致谢!

2 个答案:

答案 0 :(得分:-1)

是的,你是对的。我建议将所有数据插入MongoDb等存储器中。它具有强大的聚合框架,允许您构建请求和索引来计算平均值。

答案 1 :(得分:-1)

现在我找到了解决问题的方法......我将评估时间从5小时缩短到平均35分钟。我只是从Newtonsoft替换了JSON.net库的一个函数。将文件解析为JObject每个大约需要1.5秒。我只是将我的JSON粘贴到http://json2csharp.com/中,并为我的json结构创建了类。之后我重建了我的get函数。由于这次重建不再需要1.5秒,但现在很可能只需0.3秒。

所以我的建议是尽量避免使用JObject.Parse(string)!使用Jsondeserializer需要做更多的工作,但在处理数据时节省了大量时间!

总而言之,我更换了

JObject.Parse(string)

使用:

var jsonObject = JsonConvert.DeserializeObject<YOURCLASS>(string);

在我的例子中,该类被称为 RootObject