首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >60 to文件加载域到基域+ tld解析器

60 to文件加载域到基域+ tld解析器
EN

Code Review用户
提问于 2019-12-23 17:12:26
回答 3查看 264关注 0票数 8

我有一个60 of的域名文件。它们中的一些被重复了几次,有些有需要剥离的子域。

例如,这可能会让您更好地了解文件的外观。

代码语言:javascript
复制
email.example.com
test.staging.lol.uni.ac.uk
hello.test.com
email.example.com
test.com

解析完该文件后,我想要创建另一个包含。

代码语言:javascript
复制
example.com
uni.ac.uk
test.com

正如您所看到的,重复的基本域被移除,我们只留下了基本域和顶级域,没有重复。

这是我目前为止的尝试,当它起作用时,它很慢。

代码语言:javascript
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* * string[] topLevelDomains = new string[] { ".travelersinsurance", ".accountants", ".lamborghini", ".progressive", ".productions", ".theguardian", ".blackfriday", ".engineering", ".enterprises", ".photography", ".investments", ".motorcycles", ".blockbuster", ".contractors", ".rightathome", ".schaeffler", ".foundation", ".swiftcover", ".apartments", ".associates", ".supersport", ".immobilien", ".industries", ".healthcare", ".africa.com", ".technology", ".eurovision", ".nationwide", ".consulting", ".restaurant", ".republican", ".accountant", ".protection", ".properties", ".university", ".directory", ".community", ".education", ".montblanc", ".accenture", ".microsoft", ".melbourne", ".marshalls", ".marketing", ".financial", ".lifestyle", ".frontdoor", ".lancaster", ".solutions", ".barcelona", ".insurance", ".institute", ".analytics", ".police.uk", ".homegoods", ".amsterdam", ".security", ".partners", ".computer", ".services", ".telecity", ".lighting", ".showtime", ".football", ".clothing", ".pharmacy", ".training", ".cleaning", ".attorney", ".budapest", ".observer", ".holdings", ".brussels", ".supplies", ".broadway", ".guardian", ".graphics", ".download", ".capetown", ".discover", ".discount", ".uconnect", ".diamonds", ".ventures", ".business", ".builders", ".democrat", ".pictures", ".feedback", ".plumbing", ".exchange", ".mortgage", ".esurance", ".software", ".engineer", ".catering", ".property", ".delivery", ".genting", ".gallery", ".hosting", ".hoteles", ".holiday", ".hangout", ".hamburg", ".guitars", ".watches", ".weather", ".website", ".wedding", ".whoswho", ".windows", ".winners", ".youtube", ".zuerich", ".flowers", ".florist", ".flights", ".fitness", ".fishing", ".finance", ".markets", ".fashion", ".farmers", ".express", ".exposed", ".network", ".domains", ".cruises", ".organic", ".courses", ".coupons", ".country", ".cooking", ".contact", ".company", ".cologne", ".college", ".citadel", ".pioneer", ".caravan", ".capital", ".recipes", ".brother", ".rentals", ".booking", ".science", ".singles", ".surgery", ".systems", ".theatre", ".tickets", ".trading", ".academy", ".kitchen", ".com.vc", ".aip.ee", ".org.ee", ".org.uz", ".net.uz", ".com.uz", ".net.lr", ".fie.ee", ".org.uy", ".net.uy", ".mil.uy", ".gub.uy", ".edu.uy", ".com.uy", ".com.eg", ".nsn.us", ".med.ee", ".isa.us", ".fed.us", ".dni.us", ".edu.eg", ".org.lr", ".plc.uk", ".org.uk", ".nhs.uk", ".net.uk", ".gov.lr", ".ltd.uk", ".gov.uk", ".edu.lr", ".com.lr", ".eun.eg", ".org.ug", ".com.ug", ".edu.bh", ".com.ar", ".com.bh", ".grp.lk", ".gov.bf", ".ltd.lk", ".gov.eg", ".web.lk", ".soc.lk", ".com.vi", ".k12.vi", ".net.vi", ".org.vi", ".lib.ee", ".com.vn", ".ngo.lk", ".net.vn", ".org.vn", ".edu.vn", ".edu.lk", ".gov.vn", ".org.lk", ".int.vn", ".com.lk", ".int.lk", ".biz.vn", ".net.lk", ".sch.lk", ".pro.vn", ".com.vu", ".edu.vu", ".gov.lk", ".net.vu", ".org.vu", ".gov.ee", ".edu.ee", ".cn.com", ".com.ws", ".gov.lc", ".net.ws", ".org.ws", ".edu.lc", ".org.lc", ".gov.ws", ".mar.it", ".net.lc", ".edu.ws", ".com.lc", ".photos", ".mil.ec", ".gob.ec", ".org.lb", ".alt.za", ".net.lb", ".edu.za", ".gov.za", ".gov.lb", ".law.za", ".edu.lb", ".com.lb", ".mil.za", ".net.za", ".ngo.za", ".nis.za", ".org.hu", ".org.la", ".nom.za", ".com.la", ".per.la", ".gov.la", ".org.za", ".edu.la", ".web.za", ".gov.ec", ".edu.ec", ".abarth", ".org.ua", ".net.ua", ".physio", ".gov.ua", ".edu.ua", ".com.ua", ".mil.eg", ".net.la", ".int.la", ".piaget", ".com.kz", ".org.ec", ".mil.tz", ".mil.kz", ".abbott", ".abbvie", ".gov.kz", ".net.kz", ".edu.kz", ".pro.ec", ".med.ec", ".k12.ec", ".active", ".idv.tw", ".org.tw", ".net.tw", ".com.tw", ".mil.tw", ".gov.tw", ".edu.tw", ".net.eg", ".org.eg", ".edu.tt", ".gov.tt", ".org.kz", ".fin.ec", ".net.ec", ".com.de", ".net.ky", ".com.ec", ".africa", ".int.tt", ".pro.tt", ".agency", ".biz.tt", ".net.tt", ".org.tt", ".com.tt", ".org.ky", ".sci.eg", ".travel", ".art.dz", ".com.ky", ".kep.tr", ".edu.tr", ".k12.tr", ".mil.tr", ".pol.tr", ".bel.tr", ".gov.tr", ".tel.tr", ".pol.dz", ".bbs.tr", ".gov.ky", ".edu.ky", ".com.se", ".gen.tr", ".web.tr", ".org.tr", ".net.tr", ".biz.tr", ".airbus", ".com.tr", ".com.es", ".nom.es", ".mil.to", ".edu.to", ".org.to", ".net.to", ".gov.to", ".com.to", ".org.es", ".airtel", ".alipay", ".edu.dz", ".alsace", ".rnu.tn", ".rns.tn", ".alstom", ".gov.dz", ".pictet", ".de.com", ".anquan", ".org.tn", ".net.tn", ".nat.tn", ".net.dz", ".ind.tn", ".gov.tn", ".fin.tn", ".ens.tn", ".com.tn", ".gob.es", ".edu.tm", ".mil.tm", ".gov.tm", ".nom.tm", ".net.tm", ".org.tm", ".org.bb", ".com.tm", ".edu.es", ".gov.tl", ".com.et", ".gov.et", ".web.tj", ".org.dz", ".org.tj", ".nic.tj", ".net.tj", ".net.bb", ".mil.tj", ".int.tj", ".gov.tj", ".lom.it", ".edu.tj", ".com.tj", ".eu.com", ".biz.tj", ".gov.bb", ".org.et", ".edu.bb", ".net.th", ".com.bb", ".lig.it", ".gb.com", ".laz.it", ".fvg.it", ".edu.et", ".biz.et", ".aramco", ".emr.it", ".net.et", ".com.dz", ".org.sz", ".biz.bb", ".gb.net", ".com.fr", ".org.sy", ".com.sy", ".mil.sy", ".net.sy", ".gov.sy", ".edu.sy", ".web.do", ".gov.sx", ".nom.fr", ".red.sv", ".org.sv", ".gob.sv", ".edu.sv", ".com.sv", ".prd.fr", ".sld.do", ".org.do", ".hu.com", ".author", ".net.do", ".hu.net", ".mil.do", ".spb.su", ".gov.do", ".cam.it", ".gob.do", ".nov.su", ".edu.do", ".com.do", ".art.do", ".bayern", ".gov.dm", ".edu.dm", ".org.dm", ".net.dm", ".com.dm", ".jp.net", ".cal.it", ".berlin", ".pro.cy", ".bharti", ".mil.kr", ".org.cy", ".net.cy", ".kr.com", ".bas.it", ".blanco", ".ltd.cy", ".gov.cy", ".com.cy", ".org.st", ".net.st", ".mil.st", ".gov.st", ".biz.cy", ".edu.st", ".no.com", ".com.st", ".qc.com", ".ru.com", ".abr.it", ".org.so", ".net.so", ".com.so", ".gov.cx", ".org.cw", ".net.cw", ".org.sn", ".edu.it", ".edu.sn", ".com.sn", ".art.sn", ".tra.kp", ".bostik", ".org.sl", ".gov.sl", ".edu.sl", ".net.sl", ".com.sl", ".cci.fr", ".edu.cw", ".broker", ".rep.kp", ".mil.sh", ".org.sh", ".gov.sh", ".net.sh", ".com.sh", ".com.cw", ".per.sg", ".edu.sg", ".gov.sg", ".org.sg", ".net.sg", ".com.sg", ".inf.cu", ".gov.cu", ".net.cu", ".org.cu", ".edu.cu", ".com.cu", ".org.kp", ".camera", ".gov.kp", ".com.ge", ".edu.kp", ".com.kp", ".com.ba", ".edu.ge", ".org.se", ".gov.ge", ".gov.kn", ".org.ge", ".mil.ge", ".edu.kn", ".net.ge", ".career", ".org.kn", ".net.kn", ".pvt.ge", ".gov.it", ".net.gg", ".org.gg", ".fhv.se", ".quebec", ".sa.com", ".com.gh", ".edu.gh", ".gov.gh", ".org.gh", ".casino", ".racing", ".mil.gh", ".mil.ba", ".com.gi", ".ltd.gi", ".gov.ba", ".gov.sd", ".realty", ".med.sd", ".edu.sd", ".org.sd", ".net.sd", ".com.sd", ".gov.gi", ".edu.sc", ".org.sc", ".net.sc", ".gov.sc", ".com.sc", ".mod.gi", ".org.sb", ".net.sb", ".gov.sb", ".edu.sb", ".com.sb", ".edu.gi", ".sch.sa", ".edu.sa", ".pub.sa", ".med.sa", ".gov.sa", ".org.sa", ".net.sa", ".com.sa", ".org.gi", ".web.co", ".mil.rw", ".int.rw", ".edu.ba", ".com.rw", ".int.is", ".edu.rw", ".net.rw", ".gov.rw", ".com.km", ".rec.co", ".mil.ru", ".gov.ru", ".org.co", ".nom.co", ".center", ".snz.ru", ".net.co", ".mil.co", ".int.co", ".chanel", ".nkz.ru", ".ass.km", ".gov.co", ".mil.km", ".edu.km", ".chrome", ".church", ".kms.ru", ".circle", ".org.is", ".cmw.ru", ".prd.km", ".edu.co", ".claims", ".gov.km", ".clinic", ".nom.km", ".com.co", ".org.km", ".vrn.ru", ".gov.is", ".coffee", ".comsec", ".condos", ".coupon", ".credit", ".com.ki", ".reisen", ".udm.ru", ".gov.ki", ".org.ki", ".net.ki", ".biz.ki", ".tsk.ru", ".edu.ki", ".net.ba", ".tom.ru", ".mil.kg", ".dating", ".datsun", ".stv.ru", ".gov.kg", ".spb.ru", ".edu.kg", ".com.kg", ".net.kg", ".dealer", ".org.kg", ".degree", ".rnd.ru", ".ptz.ru", ".org.ba", ".edu.is", ".dental", ".edu.an", ".design", ".com.is", ".nsk.ru", ".net.is", ".nov.ru", ".org.an", ".direct", ".net.an", ".msk.ru", ".se.com", ".com.an", ".org.al", ".biz.az", ".repair", ".doosan", ".report", ".mil.jo", ".gov.jo", ".sch.jo", ".edu.jo", ".net.jo", ".dunlop", ".org.jo", ".khv.ru", ".dupont", ".durban", ".com.jo", ".pro.az", ".org.je", ".net.je", ".sch.ir", ".review", ".emerck", ".energy", ".jar.ru", ".org.ir", ".net.ir", ".gov.ie", ".net.al", ".estate", ".gov.ir", ".events", ".expert", ".mil.az", ".us.org", ".mil.al", ".family", ".cbg.ru", ".rocher", ".web.id", ".bir.ru", ".mil.cn", ".org.cn", ".se.net", ".net.cn", ".gov.cn", ".edu.cn", ".rogers", ".viajes", ".org.ru", ".net.ru", ".int.ru", ".edu.ru", ".com.ru", ".net.iq", ".com.gl", ".gov.al", ".gov.rs", ".edu.az", ".edu.rs", ".org.rs", ".viking", ".edu.gl", ".www.ro", ".com.cn", ".org.az", ".net.cm", ".rec.ro", ".flickr", ".nom.ro", ".villas", ".edu.al", ".org.ro", ".com.ro", ".net.gl", ".nom.re", ".gov.cm", ".com.re", ".org.gl", ".sch.qa", ".org.qa", ".net.qa", ".com.cm", ".mil.qa", ".gov.qa", ".edu.qa", ".com.qa", ".gov.az", ".org.py", ".net.py", ".mil.py", ".gov.py", ".edu.py", ".com.al", ".com.py", ".com.gn", ".mil.cl", ".int.az", ".net.az", ".ryukyu", ".com.az", ".safety", ".edu.gn", ".virgin", ".com.pt", ".org.ai", ".int.pt", ".edu.pt", ".org.pt", ".gov.pt", ".net.pt", ".gov.gn", ".net.ps", ".org.ps", ".com.ps", ".plo.ps", ".sec.ps", ".gov.ps", ".edu.ps", ".org.gn", ".sakura", ".gob.cl", ".gov.cl", ".futbol", ".vision", ".org.iq", ".gallup", ".net.gn", ".com.aw", ".net.ai", ".est.pr", ".int.ci", ".garden", ".biz.pr", ".pro.pr", ".sanofi", ".edu.pr", ".gov.pr", ".org.pr", ".net.pr", ".com.pr", ".com.gp", ".net.gp", ".net.pn", ".edu.pn", ".org.pn", ".school", ".gov.pn", ".net.ci", ".edu.gp", ".com.iq", ".george", ".schule", ".edu.ci", ".mil.iq", ".edu.iq", ".giving", ".gov.iq", ".com.ai", ".uk.com", ".global", ".com.io", ".waw.pl", ".off.ai", ".com.ci", ".voting", ".org.ci", ".gov.cd", ".vic.au", ".nom.ag", ".google", ".uk.net", ".tas.au", ".eu.int", ".gratis", ".qld.au", ".us.com", ".voyage", ".uy.com", ".mil.in", ".vuelos", ".gov.in", ".walter", ".nsw.au", ".res.in", ".health", ".warman", ".edu.in", ".hermes", ".shouji", ".hiphop", ".act.au", ".sch.id", ".hockey", ".nic.in", ".ind.in", ".webcam", ".gov.bz", ".asn.au", ".edu.bz", ".org.bz", ".net.bz", ".hughes", ".gov.au", ".com.bz", ".gen.in", ".com.by", ".mil.by", ".gov.by", ".org.bw", ".net.ag", ".org.in", ".imamat", ".net.in", ".org.bt", ".net.bt", ".gov.bt", ".insure", ".org.ag", ".intuit", ".edu.ac", ".edu.bt", ".com.bt", ".gov.bs", ".edu.bs", ".jaguar", ".org.bs", ".net.bs", ".com.bs", ".zlg.br", ".net.id", ".vet.br", ".com.ag", ".tur.br", ".joburg", ".trd.br", ".tmp.br", ".teo.br", ".juegos", ".kaufen", ".srv.br", ".slg.br", ".rec.br", ".kinder", ".kindle", ".edu.af", ".qsl.br", ".psi.br", ".psc.br", ".pro.br", ".kyknet", ".za.com", ".elk.pl", ".lancia", ".ppg.br", ".org.br", ".latino", ".odo.br", ".lawyer", ".ntr.br", ".net.af", ".lefrak", ".biz.id", ".not.br", ".edu.au", ".net.br", ".mus.br", ".soccer", ".mil.br", ".org.af", ".med.br", ".com.af", ".mat.br", ".social", ".lel.br", ".living", ".org.au", ".leg.br", ".gov.af", ".locker", ".net.au", ".jus.br", ".jor.br", ".london", ".mil.id", ".gr.com", ".inf.br", ".ind.br", ".imb.br", ".gov.br", ".org.im", ".ggf.br", ".luxury", ".com.au", ".madrid", ".g12.br", ".maison", ".makeup", ".fst.br", ".net.im", ".market", ".mattel", ".fot.br", ".fnd.br", ".ven.it", ".vda.it", ".far.br", ".eti.br", ".etc.br", ".esp.br", ".vao.it", ".eng.br", ".emp.br", ".edu.br", ".eco.br", ".ecn.br", ".gov.pl", ".com.ac", ".mobily", ".cnt.br", ".mil.ae", ".cng.br", ".cim.br", ".sos.pl", ".bmd.br", ".monash", ".sex.pl", ".rel.pl", ".gov.ae", ".in.net", ".mormon", ".com.im", ".nom.pl", ".moscow", ".mil.pl", ".bio.br", ".xihuan", ".ato.br", ".art.br", ".gsm.pl", ".arq.br", ".edu.pl", ".biz.pl", ".gov.as", ".atm.pl", ".mutual", ".aid.pl", ".org.pl", ".net.pl", ".com.pl", ".org.gp", ".sch.ae", ".gos.pk", ".gop.pk", ".gon.pk", ".gok.pk", ".gob.pk", ".gov.pk", ".web.pk", ".biz.pk", ".fam.pk", ".org.pk", ".edu.pk", ".net.pk", ".com.pk", ".nagoya", ".com.gr", ".mil.ph", ".ngo.ph", ".edu.ph", ".gov.ph", ".org.ph", ".net.ph", ".com.ph", ".edu.gr", ".edu.pf", ".org.pf", ".com.pf", ".net.gr", ".net.pe", ".com.pe", ".org.pe", ".mil.pe", ".nom.pe", ".gob.pe", ".edu.pe", ".org.gr", ".nom.pa", ".med.pa", ".abo.pa", ".ing.pa", ".net.pa", ".edu.pa", ".sld.pa", ".org.pa", ".com.pa", ".gob.pa", ".xperia", ".gov.gr", ".com.gt", ".pro.om", ".org.om", ".net.om", ".natura", ".med.om", ".gov.om", ".edu.om", ".com.om", ".studio", ".edu.gt", ".agr.br", ".adv.br", ".org.nz", ".net.nz", ".adm.br", ".mil.nz", ".org.ae", ".mil.bo", ".iwi.nz", ".net.bo", ".yachts", ".gen.nz", ".org.bo", ".cri.nz", ".com.br", ".gob.gt", ".ind.gt", ".com.nr", ".net.nr", ".org.nr", ".edu.nr", ".gov.nr", ".int.bo", ".biz.nr", ".mil.gt", ".net.gt", ".net.ae", ".org.gt", ".gob.bo", ".mil.ng", ".gov.ng", ".sch.ng", ".org.ng", ".net.ng", ".gov.bo", ".edu.ng", ".com.ng", ".co.com", ".edu.bo", ".umb.it", ".nom.ad", ".nissan", ".supply", ".web.nf", ".rec.nf", ".per.nf", ".net.nf", ".com.nf", ".com.gy", ".net.gy", ".com.hk", ".edu.hk", ".gov.hk", ".org.na", ".com.na", ".com.bo", ".sydney", ".tos.it", ".taa.it", ".target", ".org.ac", ".mil.ac", ".pro.na", ".org.bm", ".idv.hk", ".net.bm", ".mil.my", ".edu.my", ".gov.my", ".org.my", ".net.my", ".com.my", ".net.hk", ".net.mx", ".edu.mx", ".gob.mx", ".org.mx", ".com.mx", ".org.hk", ".org.mw", ".net.mw", ".gov.bm", ".int.mw", ".gov.mw", ".edu.mw", ".edu.bm", ".com.mw", ".tattoo", ".biz.mw", ".tur.ar", ".com.hn", ".pro.mv", ".org.mv", ".net.mv", ".com.bm", ".office", ".mil.mv", ".int.mv", ".olayan", ".gov.mv", ".edu.mv", ".org.ar", ".com.mv", ".biz.mv", ".org.bi", ".edu.hn", ".museum", ".sic.it", ".net.ac", ".sex.hu", ".gov.mu", ".org.mu", ".net.mu", ".com.mu", ".org.hn", ".org.mt", ".net.mt", ".edu.mt", ".com.mt", ".net.hn", ".org.ms", ".net.ms", ".gov.ms", ".edu.ms", ".com.ms", ".mil.hn", ".gov.mr", ".gob.hn", ".net.ar", ".mil.ar", ".online", ".gov.mo", ".edu.mo", ".org.mo", ".net.mo", ".com.mo", ".com.hr", ".org.mn", ".edu.mn", ".gov.mn", ".com.ht", ".edu.bi", ".org.ml", ".net.ml", ".gov.ml", ".com.bi", ".edu.ml", ".com.ml", ".oracle", ".orange", ".inf.mk", ".gov.mk", ".edu.mk", ".net.mk", ".org.mk", ".com.mk", ".tennis", ".otsuka", ".int.ar", ".gov.ar", ".com.mg", ".mil.mg", ".edu.mg", ".gob.ar", ".prd.mg", ".gov.mg", ".nom.mg", ".org.mg", ".net.ht", ".gov.bh", ".its.me", ".gov.me", ".sar.it", ".edu.me", ".org.me", ".net.me", ".gov.ac", ".pro.ht", ".org.ht", ".org.bh", ".tienda", ".med.ht", ".pug.it", ".edu.ar", ".org.ma", ".gov.ma", ".net.ma", ".pmn.it", ".art.ht", ".ae.org", ".org.ly", ".med.ly", ".sch.ly", ".edu.ly", ".plc.ly", ".gov.ly", ".net.ly", ".com.ly", ".net.bh", ".ar.com", ".asn.lv", ".net.lv", ".br.com", ".mil.lv", ".org.lv", ".gov.lv", ".edu.lv", ".com.lv", ".pol.ht", ".mol.it", ".gov.lt", ".edu.ht", ".org.ls", ".msk.su", ".total", ".ge.it", ".tours", ".fr.it", ".pb.ao", ".co.ao", ".fm.it", ".trade", ".trust", ".fi.it", ".fg.it", ".og.ao", ".gv.ao", ".fe.it", ".fc.it", ".ed.ao", ".en.it", ".tunes", ".cz.it", ".ct.it", ".cs.it", ".cr.it", ".co.it", ".cn.it", ".cl.it", ".ci.it", ".ch.it", ".vegas", ".ce.it", ".cb.it", ".video", ".vista", ".ca.it", ".co.uz", ".co.vi", ".me.uk", ".co.uk", ".ac.uk", ".ne.ug", ".go.ug", ".sc.ug", ".ac.ug", ".or.ug", ".co.ug", ".zt.ua", ".zp.ua", ".vn.ua", ".uz.ua", ".te.ua", ".sm.ua", ".ac.vn", ".sb.ua", ".rv.ua", ".pl.ua", ".od.ua", ".mk.ua", ".lv.ua", ".lt.ua", ".lg.ua", ".kv.ua", ".ks.ua", ".kr.ua", ".km.ua", ".ac.za", ".co.za", ".kh.ua", ".if.ua", ".dp.ua", ".dn.ua", ".cv.ua", ".cr.ua", ".cn.ua", ".ck.ua", ".tm.za", ".in.ua", ".tv.tz", ".sc.tz", ".or.tz", ".ne.tz", ".me.tz", ".go.tz", ".co.tz", ".ac.tz", ".actor", ".adult", ".aetna", ".co.tt", ".nc.tr", ".dr.tr", ".av.tr", ".tv.tr", ".co.tm", ".go.tj", ".co.tj", ".ac.tj", ".or.th", ".mi.th", ".in.th", ".go.th", ".co.th", ".ac.th", ".archi", ".ac.sz", ".co.sz", ".audio", ".autos", ".azure", ".baidu", ".beats", ".tm.cy", ".bible", ".bingo", ".black", ".boats", ".co.st", ".tm.fr", ".ac.cy", ".boots", ".bosch", ".build", ".tm.se", ".sa.cr", ".pp.se", ".or.cr", ".cards", ".go.cr", ".fi.cr", ".ed.cr", ".co.gg", ".co.cr", ".fh.se", ".bd.se", ".ac.se", ".ac.cr", ".tv.sd", ".co.rw", ".ac.rw", ".co.gl", ".chase", ".cheap", ".chloe", ".cisco", ".citic", ".click", ".cloud", ".coach", ".codes", ".crown", ".tw.cn", ".mo.cn", ".cymru", ".hk.cn", ".dabur", ".zj.cn", ".dance", ".yn.cn", ".xz.cn", ".xj.cn", ".tj.cn", ".sx.cn", ".deals", ".sn.cn", ".sh.cn", ".sd.cn", ".sc.cn", ".qh.cn", ".nx.cn", ".nm.cn", ".ln.cn", ".dodge", ".jx.cn", ".js.cn", ".jl.cn", ".drive", ".hn.cn", ".hl.cn", ".dubai", ".hi.cn", ".he.cn", ".hb.cn", ".ha.cn", ".earth", ".gx.cn", ".edeka", ".email", ".epost", ".epson", ".gz.cn", ".gs.cn", ".gd.cn", ".fj.cn", ".cq.cn", ".faith", ".bj.cn", ".ah.cn", ".fedex", ".final", ".pp.ru", ".ac.ru", ".in.rs", ".ac.rs", ".co.rs", ".ac.cn", ".nt.ro", ".tm.ro", ".ac.gn", ".co.cm", ".go.pw", ".ed.pw", ".or.pw", ".ne.pw", ".co.pw", ".forex", ".forum", ".co.cl", ".md.ci", ".gallo", ".ac.pr", ".games", ".go.ci", ".co.pn", ".ac.ci", ".ed.ci", ".gifts", ".gives", ".glade", ".glass", ".co.ci", ".globo", ".gmail", ".or.ci", ".gc.ca", ".yk.ca", ".sk.ca", ".qc.ca", ".pe.ca", ".green", ".gripe", ".group", ".gucci", ".on.ca", ".guide", ".nu.ca", ".nt.ca", ".ns.ca", ".nl.ca", ".nf.ca", ".nb.ca", ".mb.ca", ".bc.ca", ".ab.ca", ".homes", ".horse", ".house", ".of.by", ".iinet", ".ikano", ".co.bw", ".intel", ".irish", ".jetzt", ".tv.br", ".koeln", ".kyoto", ".av.it", ".at.it", ".weber", ".weibo", ".ar.it", ".aq.it", ".ap.it", ".ao.it", ".an.it", ".al.it", ".works", ".ag.it", ".world", ".ac.ae", ".xerox", ".yahoo", ".co.ae", ".zippo", ".id.ir", ".co.ir", ".ac.ir", ".ac.in", ".za.bz", ".co.in", ".tv.im", ".tt.im", ".co.im", ".ac.im", ".or.id", ".my.id", ".go.id", ".co.id", ".ac.id", ".co.ca", ".co.nl", ".nokia", ".co.na", ".ws.na", ".tv.na", ".cc.na", ".in.na", ".ca.na", ".mx.na", ".us.na", ".dr.na", ".or.na", ".nowtv", ".co.mw", ".ac.mw", ".omega", ".or.mu", ".co.mu", ".ac.mu", ".iz.hr", ".or.bi", ".osaka", ".co.bi", ".co.mg", ".tm.mg", ".ac.me", ".co.me", ".tm.mc", ".paris", ".ac.ma", ".co.ma", ".id.ly", ".parts", ".id.lv", ".party", ".co.ls", ".ac.lk", ".photo", ".co.hu", ".co.lc", ".ac.be", ".tm.hu", ".tv.bb", ".pizza", ".place", ".poker", ".co.bb", ".praxi", ".press", ".prime", ".rs.ba", ".sc.kr", ".re.kr", ".pe.kr", ".or.kr", ".ne.kr", ".ms.kr", ".kg.kr", ".hs.kr", ".go.kr", ".es.kr", ".co.kr", ".ac.kr", ".promo", ".co.ba", ".quest", ".rehab", ".tm.km", ".reise", ".or.jp", ".ne.jp", ".lg.jp", ".gr.jp", ".go.jp", ".ed.jp", ".co.jp", ".ad.jp", ".ac.jp", ".co.je", ".vv.it", ".vt.it", ".vs.it", ".vr.it", ".ricoh", ".vi.it", ".pp.az", ".rocks", ".rodeo", ".ve.it", ".vc.it", ".vb.it", ".va.it", ".ud.it", ".tv.it", ".ts.it", ".tr.it", ".tp.it", ".to.it", ".tn.it", ".salon", ".te.it", ".ta.it", ".sv.it", ".wa.au", ".ss.it", ".sr.it", ".sp.it", ".sener", ".so.it", ".seven", ".si.it", ".sa.au", ".sa.it", ".nt.au", ".ro.it", ".rn.it", ".rm.it", ".shoes", ".ri.it", ".rg.it", ".oz.au", ".id.au", ".re.it", ".rc.it", ".ra.it", ".pz.it", ".pv.it", ".pu.it", ".pt.it", ".skype", ".pr.it", ".sling", ".smart", ".po.it", ".pn.it", ".smile", ".pi.it", ".pg.it", ".solar", ".pe.it", ".pd.it", ".pc.it", ".or.at", ".space", ".gv.at", ".co.at", ".pa.it", ".ot.it", ".ac.at", ".or.it", ".stada", ".store", ".og.it", ".nu.it", ".study", ".no.it", ".style", ".sucks", ".na.it", ".mt.it", ".ms.it", ".swiss", ".mo.it", ".mn.it", ".tatar", ".mi.it", ".me.it", ".mc.it", ".mb.it", ".lu.it", ".lt.it", ".lo.it", ".li.it", ".tires", ".tirol", ".le.it", ".lc.it", ".tmall", ".kr.it", ".today", ".is.it", ".tokyo", ".im.it", ".tools", ".gr.it", ".it.ao", ".go.it", ".toray", ".legal", ".lexus", ".mp.br", ".lilly", ".linde", ".lipsy", ".loans", ".locus", ".lotte", ".lotto", ".lupin", ".macys", ".mango", ".fm.br", ".media", ".miami", ".tm.pl", ".money", ".mopar", ".pc.pl", ".movie", ".am.br", ".nadex", ".ac.pa", ".co.om", ".tv.bo", ".nexus", ".co.nz", ".ac.nz", ".bv.nl", ".co.gy", ".nikon", ".ninja", ".bz.it", ".bt.it", ".bs.it", ".vodka", ".br.it", ".bo.it", ".bn.it", ".bl.it", ".bi.it", ".bg.it", ".wales", ".co.ag", ".ba.it", ".watch", ".co.ve", ".lease", ".prod", ".prof", ".able", ".surf", ".adac", ".yoga", ".talk", ".raid", ".ally", ".read", ".army", ".work", ".auto", ".reit", ".kiwi", ".baby", ".band", ".bank", ".taxi", ".land", ".rent", ".rest", ".info", ".rich", ".beer", ".best", ".life", ".like", ".jobs", ".bike", ".bing", ".limo", ".blog", ".blue", ".link", ".live", ".loan", ".bofa", ".loft", ".zero", ".bond", ".love", ".aero", ".team", ".luxe", ".buzz", ".room", ".cafe", ".rsvp", ".call", ".camp", ".tech", ".care", ".cars", ".casa", ".cash", ".meet", ".meme", ".mobi", ".menu", ".cbre", ".safe", ".mini", ".mint", ".cern", ".co.no", ".chat", ".city", ".club", ".cool", ".name", ".sale", ".tips", ".date", ".deal", ".moto", ".diet", ".dish", ".docs", ".b.br", ".save", ".duck", ".duns", ".post", ".navy", ".vote", ".fail", ".town", ".fans", ".farm", ".fast", ".fiat", ".film", ".fire", ".fish", ".toys", ".news", ".next", ".scot", ".ford", ".a.se", ".seat", ".b.se", ".c.se", ".d.se", ".e.se", ".f.se", ".seek", ".g.se", ".h.se", ".i.se", ".fund", ".nico", ".k.se", ".l.se", ".m.se", ".n.se", ".o.se", ".p.se", ".r.se", ".nike", ".zone", ".game", ".tube", ".s.se", ".t.se", ".u.se", ".w.se", ".x.se", ".y.se", ".z.se", ".sexy", ".gent", ".gift", ".show", ".gold", ".silk", ".site", ".golf", ".skin", ".xbox", ".goog", ".sohu", ".open", ".guge", ".guru", ".song", ".help", ".here", ".sony", ".weir", ".page", ".host", ".pars", ".spot", ".c.la", ".wiki", ".pics", ".imdb", ".zara", ".asia", ".immo", ".star", ".ping", ".pink", ".play", ".plus", ".wine", ".java", ".porn", ".gap", ".sap", ".run", ".fly", ".rio", ".fan", ".ren", ".esq", ".qvc", ".dwg", ".pru", ".dot", ".pin", ".dnp", ".pet", ".dev", ".ott", ".day", ".net", ".csc", ".ong", ".cfd", ".one", ".ceo", ".obi", ".cbs", ".ntt", ".edu", ".nra", ".xxx", ".now", ".abb", ".ngo", ".aco", ".new", ".aeg", ".nba", ".cba", ".mtn", ".anz", ".mov", ".car", ".moi", ".axa", ".gov", ".zip", ".mma", ".bbt", ".mlb", ".bcn", ".meo", ".bzh", ".med", ".bot", ".mba", ".bet", ".ltd", ".bio", ".lol", ".bmw", ".law", ".cal", ".yun", ".you", ".xyz", ".int", ".xin", ".wtf", ".wtc", ".wme", ".win", ".wed", ".vip", ".vet", ".ups", ".trv", ".top", ".thd", ".tci", ".tax", ".tab", ".stc", ".srt", ".srl", ".soy", ".sky", ".ski", ".sex", ".tel", ".mil", ".sas", ".foo", ".rip", ".fit", ".ril", ".eus", ".red", ".eat", ".pub", ".pnc", ".dog", ".pid", ".ooo", ".dad", ".onl", ".crs", ".biz", ".off", ".ceb", ".nyc", ".cbn", ".nrw", ".com", ".org", ".aaa", ".nhk", ".abc", ".nfl", ".ads", ".nec", ".msd", ".app", ".mom", ".bar", ".pro", ".bbc", ".mit", ".cab", ".men", ".buy", ".man", ".bid", ".bnl", ".lat", ".joy", ".jnj", ".jmp", ".iwc", ".itv", ".ist", ".ink", ".ing", ".ice", ".how", ".hiv", ".hbo", ".got", ".goo", ".cat", ".gmx", ".bom", ".sew", ".li", ".lc", ".ar", ".aq", ".lb", ".la", ".kz", ".ao", ".ky", ".kr", ".kp", ".kn", ".an", ".am", ".km", ".ki", ".kg", ".jp", ".jo", ".al", ".ai", ".je", ".ag", ".it", ".is", ".af", ".ir", ".iq", ".io", ".in", ".im", ".ae", ".ie", ".ad", ".cx", ".cz", ".de", ".dj", ".cw", ".cv", ".dk", ".dm", ".do", ".cu", ".dz", ".ec", ".cr", ".yt", ".ee", ".ws", ".wf", ".vu", ".vn", ".vi", ".co", ".vg", ".ve", ".vc", ".va", ".uz", ".eg", ".uy", ".us", ".uk", ".ug", ".ua", ".tz", ".tw", ".tv", ".tt", ".es", ".cn", ".tr", ".tp", ".to", ".cm", ".tn", ".tm", ".cl", ".et", ".tl", ".tk", ".tj", ".th", ".tg", ".tf", ".td", ".ci", ".ch", ".cg", ".cf", ".cd", ".cc", ".eu", ".fi", ".tc", ".fm", ".fo", ".fr", ".sz", ".ca", ".sy", ".sx", ".sv", ".bz", ".su", ".st", ".by", ".sr", ".bw", ".bv", ".so", ".sn", ".sm", ".bt", ".sl", ".sk", ".sj", ".si", ".bs", ".sh", ".sg", ".ga", ".gb", ".gd", ".ge", ".gf", ".gg", ".gh", ".gi", ".se", ".sd", ".sc", ".sb", ".sa", ".gl", ".rw", ".ru", ".rs", ".ro", ".re", ".gm", ".gn", ".qa", ".py", ".pw", ".pt", ".ps", ".gp", ".pr", ".pn", ".pm", ".pl", ".pk", ".gq", ".gr", ".ph", ".br", ".pf", ".pe", ".pa", ".gs", ".gt", ".bo", ".om", ".nz", ".nu", ".nr", ".no", ".bm", ".nl", ".gw", ".bj", ".gy", ".ng", ".nf", ".hk", ".ne", ".bi", ".nc", ".bh", ".bg", ".na", ".bf", ".be", ".my", ".mx", ".hm", ".bb", ".hn", ".mw", ".mv", ".mu", ".mt", ".ba", ".ms", ".mr", ".hr", ".mq", ".mp", ".az", ".ax", ".aw", ".mo", ".ht", ".mn", ".ml", ".mk", ".mh", ".mg", ".me", ".md", ".mc", ".ma", ".au", ".ly", ".lv", ".lu", ".at", ".as", ".lt", ".ls", ".lr", ".lk", ".hu", ".id", ".ac" };
*/
*/

    HashSet<string> domainHashList = new HashSet<string>();

    int lineNumber = 0;

    double pc = 0;
    double totalLines = 1906663905;

    var t = Task.Run(() =>
    {
        using (var fileStream = File.OpenRead("F:\\domains-final\\domains\\domains-final.csv"))
        {
            using (var reader = new StreamReader(fileStream))
            {
                while (reader.Peek() >= 0)
                {
                    lineNumber++;

                    pc = Math.Round((lineNumber / totalLines) * 100, 10);

                    Dispatcher.Invoke(() =>
                    {
                        lineLabel.Content = "Line number: " + lineNumber.ToString() + " Percentage: " + pc.ToString();
                    });

                    try
                    {
                        string line = reader.ReadLine();

                        if (!line.Contains('.')) continue;

                        foreach (string topLevelDomain in topLevelDomains)
                        {
                            string domain = line.Trim();

                            if (domain.EndsWith(topLevelDomain))
                            {
                                string cleanedDomainTemp = line.Replace(topLevelDomain, "");

                                if (!cleanedDomainTemp.Contains('.'))
                                {
                                    string cleanedDomain = cleanedDomainTemp + topLevelDomain;

                                    if (domainHashList.Contains(domain)) break;

                                    domainHashList.Add(domain);

                                    File.AppendAllText("F:\\domains-final\\domains\\doms.txt", domain + Environment.NewLine);
                                }
                                else
                                {
                                    string cleanedDomain = cleanedDomainTemp.Split('.').Last() + topLevelDomain;

                                    if (domainHashList.Contains(cleanedDomain)) break;

                                    domainHashList.Add(cleanedDomain);

                                    File.AppendAllText("F:\\domains-final\\domains\\doms.txt", cleanedDomain + Environment.NewLine);
                                }

                                break;
                            }
                        }
                    }
                    catch { }
                }
            }
        }
    });

在运行这个程序时,我正在查看我的计算机资源,磁盘访问率是0-1%,CPU使用率是30%,所以我假设我只使用了一个核心。

我有一些想法,但我不能百分之百地确定如何正确地实现它们,因为C#不是我的主要语言。

  1. 生成更多线程并使用所有CPU核心。
  2. 尝试一次将1/3的文件加载到我的32 at内存中
  3. 缓冲磁盘写入并一次将1000个域写入结果文件
  4. 看看我是否能找到一种更有效的转换为base + TLD的方法(但到目前为止我还找不到)

我可以做哪些改进来加快代码的速度?

EN

回答 3

Code Review用户

回答已采纳

发布于 2019-12-25 01:38:44

我会将读行的过程从文件中分离出来,并使用它自己的方法。报告进度的一个很好的方法是IProgress接口。这样我们就可以计算进度并报告。你可以让这个问题变得更复杂,而不仅仅是百分比,但我只是把百分比传回。如果您想要行计数,您可以执行代码。但要小心,向调度员汇报可能会占用时间。这就是为什么我只在百分比变的时候才回击。此外,流将被缓冲,所以百分比将是轻微的,但对于大文件,这是足够接近我的经验。

我个人喜欢关于使用语句的额外括号,但我也总是将括号放在单行,如果。对我来说,这是个人的喜好,你应该以你的编码准则为基础。

这个方法类似于File.ReadLines,但是由于我们需要进度,所以我创建了这个方法。

代码语言:javascript
复制
private static IEnumerable<string> FileReadLines(string file, IProgress<int> progress)
{
    var fileSize = new FileInfo(file).Length;
    using (var fileStream = File.OpenRead(file))
    {
        using (var reader = new StreamReader(fileStream))
        {
            Int? previousProgress = null;
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                if (line != null)
                {
                    if (progress != null)
                    {
                        var percentDone = (int)Math.Round((reader.BaseStream.Position * 100d) / fileSize, 0);
                        if (previousProgress != percentDone)
                        {
                            progress.Report(percentDone);
                            previousProgress = percentDone;
                        }
                    }
                    yield return line;
                }
            }
        }
    }
}

现在,我将顶级域的数组移到静态字段中,并将其更改为哈希集。另外,我计算了域的深度。

代码语言:javascript
复制
private static readonly HashSet<string> _topLevelDomains = new HashSet<string>(new[] {
        ".travelersinsurance", ".accountants", "...."}); // did not include them all here to save ones and zeros
private static int _maxDomainLevel = _topLevelDomains.Max(d => d.Count(x => x == SplitChar));
private const char SplitChar = '.';

现在,我创建了一个方法,用于从文件中提取一行并根据顶级域哈希集中的潜在匹配返回keyvaluepairs。

代码语言:javascript
复制
private static IEnumerable<KeyValuePair<string, string>> GetDomains(string domain)
{
    var domainParts = domain.Split(SplitChar);
    int start;
    if (domainParts.Length <= _maxDomainLevel)
    {
        start = 1;
    }
    else
    {
        // only need to match on part of the string since we can eliminate any that have more parts than in the top level domain
        start = domainParts.Length - _maxDomainLevel;
    }
    for (var i = start; i < domainParts.Length; i++)
    {
        var range =  domainParts.Length - i;
        // build up the domain from the subparts
        var key = SplitChar + string.Join(SplitChar, Enumerable.Range(i, range)
            .Select(x => domainParts[x]));
        var value = domainParts[i - 1] + key;
        yield return new KeyValuePair<string, string>(key, value);
    }
}

现在我们已经有了所有的部分,我们可以编写一些PLINQ代码来并行地处理它。

代码语言:javascript
复制
public static void ParseFile(string inputfile, string outputFile, IProgress<int> progress)
{
    var domains = FileReadLines(inputfile, progress)
        .AsParallel()
        .Where(x => x.Contains('.'))
        .Select(x => GetDomains(x).FirstOrDefault(kv => _topLevelDomains.Contains(kv.Key)))
        .Select(kv => kv.Value)          
        .Where(x => x != null)
        .Distinct();
    File.AppendAllLines(outputFile, domains);
}

现在你可以这样称呼它了。我的例子是将进度放到控制台上,但您也会将其推送给调度程序。

代码语言:javascript
复制
ParseFile(@"c:\temp\source.txt", @"c:\temp\output.txt", new Progress<int>(l => Console.WriteLine(l)));

显然,我没有60Gig文件,但我相信使用PLINQ并将顶级域更改为哈希集会更快。如果您想要完全控制,那么我会使用一个生产者/消费者,像TPL DataFlow,但我认为这是过头了。

票数 9
EN

Code Review用户

发布于 2019-12-25 10:29:23

一个60 GB的文件适合很多域。

在每个调用之后报告进度会导致如此多的调用,因此应用程序最终可能会花费更多的时间来报告进度,而不是做有用的工作。

考虑减少报告进度,例如只增加1%或0.1%。

票数 6
EN

Code Review用户

发布于 2019-12-23 18:50:36

当使用多个Using块时,实际上不需要在第一个块的内部嵌套第二个块,因此如下所示:

代码语言:javascript
复制
using (var fileStream = File.OpenRead("F:\\domains-final\\domains\\domains-final.csv"))
{
    using (var reader = new StreamReader(fileStream))
    {
...

看上去像这样

代码语言:javascript
复制
using (var fileStream = File.OpenRead("F:\\domains-final\\domains\\domains-final.csv"))
using (var reader = new StreamReader(fileStream))
{
...

在foreach循环中,我也会将第一个if语句从当前迭代中转储出来,这将减少您在foreach循环中的缩进量。

在foreach循环中if/else语句的if部分中,您创建变量cleanedDomain,但不要在该语句中使用它,一旦您离开该变量被释放的语句,您可以删除该赋值,因为它可以为您节省一点性能,但它可能并不明显。我删除了它的“后”代码,以清除一些噪音。

Foreach循环之前:

代码语言:javascript
复制
foreach (string topLevelDomain in topLevelDomains)
{
    string domain = line.Trim();
    if (domain.EndsWith(topLevelDomain))
    {
        string cleanedDomainTemp = line.Replace(topLevelDomain, "");
        if (!cleanedDomainTemp.Contains('.'))
        {
            string cleanedDomain = cleanedDomainTemp + topLevelDomain;
            if (domainHashList.Contains(domain)) break;

            domainHashList.Add(domain);

            File.AppendAllText("F:\\domains-final\\domains\\doms.txt", domain + Environment.NewLine);
        }
        else
        {
            string cleanedDomain = cleanedDomainTemp.Split('.').Last() + topLevelDomain;

            if (domainHashList.Contains(cleanedDomain)) break;

            domainHashList.Add(cleanedDomain);

            File.AppendAllText("F:\\domains-final\\domains\\doms.txt", cleanedDomain + Environment.NewLine);
        }

        break;
    }
}

Foreach循环后:

代码语言:javascript
复制
foreach (string topLevelDomain in topLevelDomains)
{
    string domain = line.Trim();
    if (!domain.EndsWith(topLevelDomain)) continue;

    string cleanedDomainTemp = line.Replace(topLevelDomain, "");
    if (!cleanedDomainTemp.Contains('.'))
    {
        if (domainHashList.Contains(domain)) break;

        domainHashList.Add(domain);
        File.AppendAllText("F:\\domains-final\\domains\\doms.txt", domain + Environment.NewLine);
    }
    else
    {
        string cleanedDomain = cleanedDomainTemp.Split('.').Last() + topLevelDomain;
        if (domainHashList.Contains(cleanedDomain)) break;

        domainHashList.Add(cleanedDomain);
        File.AppendAllText("F:\\domains-final\\domains\\doms.txt", cleanedDomain + Environment.NewLine);
    }

    break;
}

我还要提醒您,不要使用try/catch简单地绕过代码中的异常,而不适当地处理它们。

您不应该捕获所有的异常,在catch语句中什么也不做,这是错误的做法。相反,您应该了解哪些异常确实发生,并了解如何在开发阶段在代码中处理这些情况,也许您捕获某些异常并在catch语句中执行某些任务。允许异常冒泡并发出警报,会让您知道输入中存在问题或与应用程序的连接存在问题,如果您只是在不处理异常的情况下运行应用程序,则可能会将您的钱投到服务器上而不知道。

变量pctotalLines是神奇的数字

pc似乎是一个百分比,但是另一个变量似乎是一个任意的数字1906663905,您应该让自己知道这个数字是什么,或者从正在读取的文件中找到获取它的方法(假设它是正在读取的文件中的总行数)。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/234545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档