在我的工作中,我要为以下问题开发和实现解决方案:
给定一个包含 30M 记录的数据集,从特定数据集字段中提取(键,值)元组,按键和值对它们进行分组,存储每个键的相同值的数量。将每个键的前 5000 个最常见值写入数据库。每个数据集行最多包含 100 个(键、值)序列化 XML 形式的元组。
我想出了这样的解决方案(使用 Spring-Batch ):
批处理作业步骤:
第 1 步。 遍历数据集行并提取(键、值)元组。获得一些固定数量的元组后,将它们转储到磁盘上。每个元组进入一个名称模式为“/chunk-”的文件,因此指定键的所有值都存储在一个目录中。在一个文件中,值按顺序存储。
第 2 步。 遍历所有 '' 目录并将它们的 block 文件合并到一组相同的值中。由于值是按顺序存储的,因此将它们合并为 O(n * log k) 复杂度是微不足道的,其中“n”是 block 文件中值的数量,“k”是 block 的初始数量。
第 3 步。对于每个合并的文件(换句话说,对于每个键)使用 PriorityQueue 顺序读取其值维护前 5000 个值而不将所有值加载到内存中。将队列内容写入数据库。
我在这个任务上花了大约一周的时间,主要是因为我之前没有使用过 Spring-Batch,而且我试图强调需要准确实现多线程部分的可伸缩性。
问题是我的经理认为这项任务太容易了,所以不会花那么多时间在上面。
问题是 - 您知道更有效的解决方案还是可能更容易实现但效率较低的解决方案?您需要多少时间来实现我的解决方案?
我知道类似 MapReduce 的框架,但我不能使用它们,因为该应用程序应该在具有 3 个内核和 1GB Java 堆的简单 PC 上运行。
提前致谢!
UPD:我想我没有清楚地说明我的问题。让我换个方式问:
考虑到问题并作为项目经理或至少是任务审阅者,您会接受我的解决方案吗?您会花多少时间完成这项任务?
最佳答案
您确定这种方法比预扫描 XML 文件以提取所有 key ,然后为每个 key 一遍又一遍地解析 XML 文件更快吗?您在此解决方案中执行大量文件管理任务,这绝对不是免费的。
因为你有三个核心,你可以同时解析三个键(只要文件系统可以处理负载)。
关于java - 在大型数据集中对相同值进行分组的有效解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12892113/
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht