问题描述
现有泛型List<string>lstXml=newList<string>,lstXml里有500万个值,其中有10个正确的xml格式,怎么[高效率]的找出/判断这10个xml的索引位置。抛异常的方式就不要说了,要高效率。这个算法该咋个写呀,大神来破。
解决方案
解决方案二:
话说,这个需求挺蛋疼,为什么把那么多乱七八糟的字符串都存到一个list里去如果你完全不知道其他字符串到底有可能是什么,不抛异常还能怎么办,自己正则判断吗,效率更低
解决方案三:
这个问题就好像在问:垃圾场里有500万个塑料袋,里面装的都不知道是什么垃圾,但是其中10个里面装的是鸡蛋,怎么样能够有效率的把它们找出来最好的办法就是一开始就不要把鸡蛋扔进垃圾场里去
解决方案四:
引用2楼Z65443344的回复:
这个问题就好像在问:垃圾场里有500万个塑料袋,里面装的都不知道是什么垃圾,但是其中10个里面装的是鸡蛋,怎么样能够有效率的把它们找出来最好的办法就是一开始就不要把鸡蛋扔进垃圾场里去
也就是这问题无解哦?xml是有规律的字符串,除了抛异常,必定还是有其他算法能快速找出来哦。
解决方案五:
首先怎么的判断是不是XML格式就是个问题
解决方案六:
引用4楼wangjun8868的回复:
首先怎么的判断是不是XML格式就是个问题
对呀,说个半天,就是这问题鄙人没有太好的解决方案,这不,来csdn求助各位经验丰富的大神呢。
解决方案七:
即使你有其他办法能够直接判断字符串是否合法(比如用正则自己去慢慢匹配),从500万乱七八糟的数据里遍历一遍就已经很没有效率了
解决方案八:
话说,你的list里的数据到底哪来的,不是你自己放进去的吗,放进去之前先判断一下,如果是xml,放到另一个list里,不好吗无脑add进去,过后又找,太没效率了
解决方案:
这个我觉的肯定不是这么弄的,你肯定要把合法的另外存,而过滤这个合法的XML的过程,注定高效不了。
解决方案:
如果List里的xml字符串错误原因一致的话倒是可以针对这个错误原因进行检查但是如果错误原因不确定或者错误种类比较多的话,LoadXML()然后捕获异常的方式反而效率会比较高而且检查效率也与XML字符串的长度有关
解决方案:
引用7楼Z65443344的回复:
话说,你的list里的数据到底哪来的,不是你自己放进去的吗,放进去之前先判断一下,如果是xml,放到另一个list里,不好吗无脑add进去,过后又找,太没效率了
list的数据是我添加进去的,放进去之前先判断一下,判断的时候不一样么?100万条数据不一样要判断100万次么,判断这100万次是在所难免的,现在就想找个高效的方法来判断。
解决方案:
自己先简单预查一下,例如检测开头和结尾是不是<>就可以过滤掉大部分
解决方案:
那要看“不正确的xml”都是怎么个不正确。
解决方案:
引用12楼caozhy的回复:
那要看“不正确的xml”都是怎么个不正确。
是的,这正是我反复强调的,不知道错误的字符串都有可能是什么,就无从判断引用10楼qy415421的回复:
list的数据是我添加进去的,放进去之前先判断一下,判断的时候不一样么?100万条数据不一样要判断100万次么,判断这100万次是在所难免的,现在就想找个高效的方法来判断。
是你加进去的没错,问题是数据源头肯定不是你代码写死的吧,数据到底是哪里来的?从数据库里读出来的?从网页上抓取的?
解决方案:
我们假设你的错误的xml中任何地方都可能有错,比如最后一个标记的>没有封闭,有一种不回溯检测xml是否正确的算法。那么显然对于list的每个成员,都必须完整读取一次才可以判断。
解决方案:
引用13楼Z65443344的回复:
Quote: 引用12楼caozhy的回复:
那要看“不正确的xml”都是怎么个不正确。是的,这正是我反复强调的,不知道错误的字符串都有可能是什么,就无从判断引用10楼qy415421的回复:
list的数据是我添加进去的,放进去之前先判断一下,判断的时候不一样么?100万条数据不一样要判断100万次么,判断这100万次是在所难免的,现在就想找个高效的方法来判断。是你加进去的没错,问题是数据源头肯定不是你代码写死的吧,数据到底是哪里来的?从数据库里读出来的?从网页上抓取的?
网页上,所有的http请求数据,来自于不同网站,网站随机的,所以说,数据来源我们不可控啊。目前找到一个老外用汇编写的xml解析程序,效率还蛮高的,我用c++写个接口,编译成dll,再用c#调用,正在测试效率。
解决方案:
引用14楼caozhy的回复:
我们假设你的错误的xml中任何地方都可能有错,比如最后一个标记的>没有封闭,有一种不回溯检测xml是否正确的算法。那么显然对于list的每个成员,都必须完整读取一次才可以判断。
对,非常对,但就差这么一个算法,算法的不同,效率也各有千秋。
解决方案:
除了多开几个线程,如何判断是否是xml还是用微软现成的通过字符串加载xml方法,通过trycatch来判断是否正确
解决方案:
这个就跟排序算法没有所谓最好最快一样,对于不同的数据,同样的算法效率也不见得一样比如如果错误数据是固定缺失了最后的>,其实字符串判断最后是不是>就行了,这样是最快的,但是对于其他类型的错误,这个算法就无能为力了而从头到尾检查每一项是否合法,必然是效率比较低的算法,但是也是适应性最强的算法
解决方案:
用try,catch捕获异常,虽然效率最低,但是除了能够验证结构是否缺失,还能验证每一项类型是否正确,就是是否能真正以xml的方式读取出来数据
解决方案:
我会告诉你我做过list里面有1000多万的数据的模糊搜索吗?最后哥写了一个多线程的分段搜索解决了。
解决方案:
只能先分批过滤,按照XML格式头比对
解决方案:
引用20楼luo18273197110的回复:
我会告诉你我做过list里面有1000多万的数据的模糊搜索吗?最后哥写了一个多线程的分段搜索解决了。
我觉得多线程分段这思路OK
解决方案:
如果数量级是500万,加try.catch肯定要蛋疼.这个数量级如果不用多线程谈效率也是扯淡.可不可以往索引表,Map等方向想.像跑解密一样.
解决方案:
顶一下顶一下顶一下顶一下
解决方案:
有你讨论的这5个钟头,估计100w的数据已经判断完了。
解决方案:
这种破问题也置顶,浪费时间。建议bz要严格把关。