Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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#使用Json重复评估许多文件_C#_Json_Algorithm_Performance_Bigdata - Fatal编程技术网

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

C#使用Json重复评估许多文件,c#,json,algorithm,performance,bigdata,C#,Json,Algorithm,Performance,Bigdata,我编写了一个算法来评估许多Json文件(平均50个文件,每个文件平均9mb),这个评估会重复138次。 首先将数据写入一个大的500mb jsonfile,然后将其拆分为这些小文件来处理数据。我正在使用JSON.NET来实现这一点。 读取这些文件一点也不耗时,但将它们解析为JObject平均需要1,5秒。我读了50个文件138次,这意味着我读了6900次文件。 一次跑步平均需要4-5个小时,这是我没有的时间 为了演示这个算法的作用,假设有138个独特的玩家,他们都玩了50000个游戏。现在你得到

我编写了一个算法来评估许多Json文件(平均50个文件,每个文件平均9mb),这个评估会重复138次。
首先将数据写入一个大的500mb jsonfile,然后将其拆分为这些小文件来处理数据。我正在使用JSON.NET来实现这一点。
读取这些文件一点也不耗时,但将它们解析为JObject平均需要1,5秒。我读了50个文件138次,这意味着我读了6900次文件。
一次跑步平均需要4-5个小时,这是我没有的时间

为了演示这个算法的作用,假设有138个独特的玩家,他们都玩了50000个游戏。现在你得到了这5万场比赛,并且想要评估每个球员的平均值。现在你必须为每个玩家检查这50个文件,当它完成时,这些值被写入一个文件,下一个玩家的评估开始。每次评估大约需要1,2-2GB内存,因为我的算法使用函数来填充列表、添加值、计算平均值等。计算本身很快,目前不需要改进,我每次都更新代码以创建更快的体验

并行性用于从API收集数据,这非常有效,但在评估的情况下,它无法使用,因为文件在处理时被锁定,它将占用大量ram等

所以我的问题是,有什么技术可以让我比现在更快地处理它吗?平均处理6900个文件似乎是错误的做法,我认为我遗漏了一些东西


提前谢谢

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

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

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

总之,我替换了

JObject.Parse(string)
与:

var jsonObject=JsonConvert.DeserializeObject(字符串);

在我的例子中,这个类叫做RootObject

,谢谢你的回答!你认为在本地机器上没有其他方法可以做到这一点吗?是的,有一种方法。在任何情况下,我们都需要使用一些本地数据库。如果没有数据示例,并且没有至少一些代码向我们显示如何读取文件,就不可能给出任何合理的建议。用具体的例子更新你的问题,我很乐意帮助你。
var jsonObject = JsonConvert.DeserializeObject<YOURCLASS>(string);