• 关于 直接内存访问怎么用 的搜索结果

问题

springmvc+shiro的后台,怎么同时支持网页前端和APP呢?

a123456678 2019-12-01 20:26:30 1646 浏览量 回答数 1

回答

python 数据源 ,  主索引+增量索引 =你用在千万级数据上试过没。。, 而且搜索量非常大 是访问量的2-3倍 mongo做千万级应用准备最少上半个机柜大内存机吧 sphinx不能直接支持mongodb的。我们之前是用python来建立sphinx和mongodb之间的数据接口。sphinx索引完成之后,搜索动作时在sphinx自身的索引文件上完成的,不涉及的对数据库的搜索了。然后php再根据sphinx给出的id去读mongodb就可以了,怎么会出现断开什么的? 不过python去读mongodb的速度肯定要比sphinx自己直接读mysql要慢,有实力的话可以自己用c写个接口。 mongo做千万级应用准备最少上半个机柜大内存机吧 sphinx不能直接支持mongodb的。我们之前是用python来建立sphinx和mongodb之间的数据接口。sphinx索引完成之后,搜索动作时在sphinx自身的索引文件上完成的,不涉及的对数据库的搜索了。然后php再根据sphinx给出的id去读mongodb就可以了,怎么会出现断开什么的? 不过python去读mongodb的速度肯定要比sphinx自己直接读mysql要慢,有实力的话可以自己用c写个接口。 估计sphinx要分布式,mongodb性能影响应该会小一点。。。 sphinx做raid主要提升磁盘速度吧。 sphinx不能直接支持mongodb的。我们之前是用python来建立sphinx和mongodb之间的数据接口。sphinx索引完成之后,搜索动作时在sphinx自身的索引文件上完成的,不涉及的对数据库的搜索了。然后php再根据sphinx给出的id去读mongodb就可以了,怎么会出现断开什么的? 不过python去读mongodb的速度肯定要比sphinx自己直接读mysql要慢,有实力的话可以自己用c写个接口。 python+sphinx+mongodb以前也这样做过。。千万级!!没试过。 另外给sphinx做缓存。。还有有其它方法?? 把所有的查询结果放到memcache里面啊,如果不存在数据过期或者更新的话;还可以试试把sphinx的index文件放到/dev/shm里面,做好重启后重新索引的脚本就是了。 ######做二次缓存也可。。 应该大部分消耗在sphinx上吧。。 如果同时缓存mongodb中的文本数据的话,内存占用大了。所以只缓存sphinx的数据。######就是"你可以直接把所有的查询结果放到memcache里面" mongo做千万级应用准备最少上半个机柜大内存机吧

一枚小鲜肉帅哥 2020-06-20 19:33:10 0 浏览量 回答数 0

回答

@双_双 速来围观一大片空白。。。 其实我也看不懂   公司私服没那么大访问量, Connectiontimedout到是也在日志里看到过我记得nexus是可以作为独立服务端运行的,试试抛掉tomcat呢?直接用standaloneservice运行起来看看呢?nexus下面都是按照目录层级结构组织的,nginx做个动静分离应该就行了吧 nginx日志是说连接不上后端tomcat吧; 但是tomcat日志是说停止tomcat时不能回收某些对象,可能是内存泄露。怎么停的,是内存泄露导致Tomcat内存用完死掉? 还有其他日志么? 第一次见到服务器用debianUbuntuserver?那也够牛的~这服务器是ubuntu的用了一段时间的osc之后,果断换回默认的了。嗯,用中央库也可以的

爱吃鱼的程序员 2020-06-15 11:11:13 0 浏览量 回答数 0

新用户福利专场,云服务器ECS低至96.9元/年

新用户福利专场,云服务器ECS低至96.9元/年

问题

我的网站被DDOS攻击了吗?

行云河 2019-12-01 21:16:42 6492 浏览量 回答数 6

问题

要购买服务器了,请问配置怎么选择?谢谢

eczzxec 2019-12-01 21:46:58 3147 浏览量 回答数 2

问题

准备用最基本的阿里云香港空间,有几个问题咨询下

kevingroup 2019-12-01 22:01:46 8749 浏览量 回答数 4

回答

Re阿里云主机速度怎么这么慢 512内存不建议使用apache做为住服务器 ------------------------- 回12楼a547198894的帖子 不好说,1G我都不敢用apache 如果你的站没什么流量,不要找客服了,他们不会管你的网站程序是否有问题的。 你所说的一会快一会慢,主要是有两种情况: 1、你所使用的是生成静态文件方式的缓存插件(wp super cache),当你访问的是缓存文件时速度当然快。 2、当你访问的页面需要重新生成缓存文件时,直接卡住。这个期间可能是和插件,环境或内存,或cpu有关链。 以上2种情况是一会快一会慢的主要原因。 你可以先将所有插件关闭,来看看页面执行时间。 PS:缓存插件最好只选择一种,不然会冲突。缓存器如eaccelerator先不要装

ali5794758 2019-12-02 00:31:38 0 浏览量 回答数 0

回答

回1楼maikellycai的帖子 那方面的设置问题啊?求详解哈,谢谢 ------------------------- 回3楼bcaiwa的帖子 配置如下: CPU: 1核    内存: 2GB  数据盘: 5G    带宽: 2Mbps 我想应该不是配置的问题吧? ------------------------- 回2楼holdb的帖子 不知道怎么解决啊? ------------------------- 回7楼服务器之家的帖子 怎么优化啊?之前用win7系统就感觉很慢,但是访问还是没问题的。可换了linux,现在倒好直接访问不了了。

氧分子网 2019-12-01 23:23:56 0 浏览量 回答数 0

问题

最近42杭州路线有问题???

lxj186 2019-12-01 21:23:15 5223 浏览量 回答数 9

问题

阿里云香港节点WIN200864位使用感受

天佑: 2019-12-01 22:03:32 10448 浏览量 回答数 6

回答

eclipse自带tomcat? 反正我用的tomcat7###### 从来不在Eclipse里配Tomcat的路过!######回复 @张培立 : 单独在 tomcat 里设置好 context 指向项目的目录######那红薯怎么配置的呢!请详解!###### 我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合…… ###### 引用来自#4楼“无知的 TonySeek”的帖子 我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合……  我用的也是eclipse的jee版本,感觉比myeclipse好用,自从用了这个版本就再也没有碰过myeclipse###### 引用来自#4楼“无知的 TonySeek”的帖子 我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合……  奇怪,为什么我下的java ee版没有内置tomcat 不过3.6对tomcat7支持不错###### Eclipse JEE 直接配置tomcat就可以,新建server后直接双击配置其部署位置,让其直接部署到tomcat的webapps即可。###### 用eclipse自带那个service配tomcat效率比较低,习惯用tomcat插件+context配置文件###### 首先,从来不配置tomcat在eclipse中,这样eclipse会占用更多内存,容易卡死 一般配置应用在tomcat x\conf\Catalina\localhost\中  新增一个xml  如:example.xml  添加内容: <Context path="/xxxx" docBase="E:\workspace\xxxx" debug="0" privileged="true"> </Context> 访问http://x.x.x.x/example

montos 2020-05-31 00:11:54 0 浏览量 回答数 0

回答

eclipse自带tomcat? 反正我用的tomcat7######从来不在Eclipse里配Tomcat的路过!######回复 @张培立 : 单独在 tomcat 里设置好 context 指向项目的目录######那红薯怎么配置的呢!请详解!######我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合…… ###### 引用来自#4楼“无知的 TonySeek”的帖子 我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合……  我用的也是eclipse的jee版本,感觉比myeclipse好用,自从用了这个版本就再也没有碰过myeclipse###### 引用来自#4楼“无知的 TonySeek”的帖子 我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合……  奇怪,为什么我下的java ee版没有内置tomcat 不过3.6对tomcat7支持不错######Eclipse JEE 直接配置tomcat就可以,新建server后直接双击配置其部署位置,让其直接部署到tomcat的webapps即可。######用eclipse自带那个service配tomcat效率比较低,习惯用tomcat插件 +context配置文件######首先,从来不配置tomcat在eclipse中,这样eclipse会占用更多内存,容易卡死 一般配置应用在tomcat x\conf\Catalina\localhost\中  新增一个xml  如:example.xml  添加内容: <Context path="/xxxx" docBase="E:\workspace\xxxx" debug="0" privileged="true"> </Context> 访问 http://x.x.x.x/example

kun坤 2020-05-27 17:10:26 0 浏览量 回答数 0

回答

eclipse自带tomcat? 反正我用的tomcat7###### 从来不在Eclipse里配Tomcat的路过!######回复 @张培立 : 单独在 tomcat 里设置好 context 指向项目的目录######那红薯怎么配置的呢!请详解!###### 我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合…… ###### 引用来自#4楼“无知的 TonySeek”的帖子 我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合……  我用的也是eclipse的jee版本,感觉比myeclipse好用,自从用了这个版本就再也没有碰过myeclipse###### 引用来自#4楼“无知的 TonySeek”的帖子 我直接下载官网的 Java EE 版 Eclipse ,结果内置了 tomcat 整合……  奇怪,为什么我下的java ee版没有内置tomcat 不过3.6对tomcat7支持不错###### Eclipse JEE 直接配置tomcat就可以,新建server后直接双击配置其部署位置,让其直接部署到tomcat的webapps即可。###### 用eclipse自带那个service配tomcat效率比较低,习惯用tomcat插件+context配置文件###### 首先,从来不配置tomcat在eclipse中,这样eclipse会占用更多内存,容易卡死 一般配置应用在tomcat x\conf\Catalina\localhost\中  新增一个xml  如:example.xml  添加内容: <Context path="/xxxx" docBase="E:\workspace\xxxx" debug="0" privileged="true"> </Context> 访问http://x.x.x.x/example

kun坤 2020-06-06 19:07:29 0 浏览量 回答数 0

回答

Re内存占用怎么突然变成97%左右了呢?求指导。。    看了一篇帖子原来buffer和cache是正常的,智能说我的内存太小了 Linux认证:buffer和cache区别,我们一开始,先从Free命令说起。   Free   free 命令相对于top 提供了更简洁的查看系统内存使用情况:   $ free                    total                     used                 free                   shared               buffers             cached   Mem:      255268                238332                 16936                       0                    85540         126384 -/  buffers/cache: 26408 228860Swap: 265000 0 265000   Mem:表示物理内存统计   -/  buffers/cached:表示物理内存的缓存统计   Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。   系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。   我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。   total1:表示物理内存总量。   used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。   free1:未被分配的内存。   shared1:共享内存,一般系统不会用到,这里也不讨论。   buffers1:系统分配但未被使用的buffers 数量。   cached1:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。   used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。   free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。   可以整理出如下等式:   total1 = used1   free1total1 = used2   free2used1 = buffers1   cached1   used2free2 = buffers1   cached1   free1         buffer cache,又称bcache,其中文名称为缓冲器高速缓冲存储器,简称缓冲器高缓。另外,buffer cache按照其工作原理,又被称为块高缓。 在linux读写文件时,它用于缓存物理磁盘上的磁盘块,从而加快对磁盘上数据的访问。 buffer cache的内容对应磁盘上一个块(block),块通常为1K,都是连续的。 在linux下,为了更有效的使用物理内存,操作系统自动使用所有空闲内存作为Buffer Cache使用。当程序需要更多内存时,操作系统会自动减小Cache的大小   buffer 与cache 的区别   A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use.   更详细的解释参考:Difference Between Buffer and Cache   对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory?   cache 和 buffer的区别:   Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache.   Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。   Free中的buffer和cache:(它们都是占用内存):   buffer :作为buffer cache的内存,是块设备的读写缓冲区   cache:作为page cache的内存, 文件系统的cache   如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。

lipan800538 2019-12-02 02:19:53 0 浏览量 回答数 0

问题

等待高手指导一下,就入手阿里云!!!

uucoc 2019-12-01 21:09:15 8817 浏览量 回答数 9

回答

printf("aaa\n");这不是在打印a字符吗?,而且,只有段越界才会引起进程的段错误信号,你访问的地址仍然在进程的合法空间范围内,当然空指针这类地址基本不合法。回复 @xxdd:看看gdb进程的infoprocmappings或者去cat/proc/$pid/maps,崩溃指的是程序read,write,execute了一个virtualaddress,这个address不在操作系统给其进程分配的虚拟地址段之内,称其为段错误回复 @xxdd:我的理解是,只有当指针指向只读区域时,你更改才会报错。想想八门神器,一个程序都可以改别的程序里的内存值,这不就很好的解释了你的疑问了吗?您好,我指的是fun()函数里面的n[111],已经越界了,为什么程序可以正常运行,而不是崩溃? 因为根本报不了错。 编译器,编译器怎么判断数组下标的范围?没有任何一种万无一失的方法,最多用静态检查工具,处理掉一些错误。 运行期,程序持有的信息更少,数组元素的访问就是数组其实元素的地址+偏移量计算出地址。这个时候就是对地址的直接访问,运行期是不会记录类型信息的,根本不知道这个数组设定的大小。这个时候程序是否崩溃就要看人品了,只有操作系统发现你访问了不该访问的内存区域,程序才会崩溃。谢谢,应该是这样的。c++本来就不会检查边界的,所以遇到数组参数的时候,一般会加一个长度,而java是基于这个问题做了优化编译器不检查,但是为什么运行的时候,也不报错? 数组下标越界是undefinedbehavior. 结果是未定义的知道什么意思吧 两种写法程序都可以正常运行,为啥?明明操作了非法的地址。越界是 undefinedbehavior。所谓 undefinedbehavior就是怎样都行,可以崩溃、可以什么都不干。你如果非要问为什么C++这样规定,那是因为检查这些错误代价实在太大了。您好,我想知道的是,为什么这个程序可以正常运行?数组已经指向了非法的地址。数组传递变成指针,他允许你进行修改,改的对不对成了问题 你把堆改成栈再试试回复 @xxdd:堆所分配的是系统中剩余的可用内存。new出来的内存指针所指向的地址,在你指定的大小之后,仍然可能有很大一块可用内存,不报错是有可能的。inta[2];fun(a);这个就是栈吧?这应该和系统内存分配有关系吧,报错应该是系统认为地址非法给你报错,系统肯定是认为你这个地址不非法呗,所以不报错newint[2]是从堆上分配的,数组越界是未定义行为,可能是没有进程默认堆大,没有非法访问,所以没有coredump掉。你越界大一些看看好像是这个原因,那栈上那个为什么也不报错? 楼主听说过“缓冲区溢出”的说法吧 我个人理解一个指针本来就能在自己的地盘里指来指去,想要指到哪里是程序员的自由,编译器不做这方面的任何限制与检查。 Linux上检查缓冲区溢出跟内存泄露可以试试valgrind还有电网electric-fence

爱吃鱼的程序员 2020-06-12 14:05:26 0 浏览量 回答数 0

问题

OSS存储利用内网CDN叠加多台5MECS网宽

betterhomechina 2019-12-01 21:04:17 14039 浏览量 回答数 5

回答

文件映射并不能直接提高速度(前提是读取函数同类比较:C库文件IO、其他语言库文件IO、操作系统API,跨库的话略有差异),只是给多进程之间数据共享提供了高速方式,只访问一份数据即可,没有拷贝赋值的开销。######请问如何才能提高文件的读取速度###### 一般来说,操作系统内核API > 操作系统封装API > C库文件IO >其他封装语言库文件IO。   ---不是普遍真理。 具体的你可以换换文件读取接口测试出来。 ######没有其他好的方案吗?我们行业专业的软件从60G数据中提取600M数据只需要30s,而我们需要一个多小时,不知道怎么实现######可以考虑看看Sysem Call直接与底层交互访问IO ######提取? 是把文件具体内容按二进制方式复制到你的容器里面吗?文件读取+复制,不同API的组合性能上确实有差异,这个差异也是非常微小的,重复10万次以上可能才会有几十秒的差距,不可能如你所说是30s与一个多小时的差距!一定还有其他操作影响了######你贴代码吧。 同样网络条件、同样硬盘、同样文件大小,30s与1个多小时的差距到底是怎样诞生的呢?各个API参数调整、串行并行、缓存都不至于有如此差距######memset(pcDataBuf,0,2734765*204); for(int j = 0; j<27031; j++) { fseek(pf,j*(240+6001*4)+3600,0); fread(pcDataBuf+j*240, 1,240,pf); } ​ ​这是我的测试代码,你能想到怎么提高嘛?###### memset fseek fread 恐怕真没有内存映射快!涉及到页面缓存、进程堆栈数据交换,你需要尽量采用内核API,绕开中间驱动层直接和磁盘IO打交道。 不过,题外话,现在通过纯软件方式提高速度已经很少很少了,都是直接换硬盘、提带宽的,那个效果显著!你可以跟你老板谈谈硬件升级方案或者改改需求了:-) ######我用内存映射之后速度没有改善啊

kun坤 2020-06-07 14:12:41 0 浏览量 回答数 0

问题

【阿里云产品评测】个人WP站的云体验

cnsjw 2019-12-01 20:54:27 22207 浏览量 回答数 25

回答

Re调查:SLB收费后你会继续使用吗? 这个主要看lz的场景。对一下流量大的网站,可以把之前的云主机的带宽留1个VM留1M公网接入做登陆就OK了。正常的访问流量都走SLB进来,这样安装流量算钱应该是能节省成本的。 举例来说现在你选1个乞丐版VM :1个月55块,你把带宽调到10M就是一个月657了,这个你可以算9M的带宽一个月是600(阿里云的BGP带宽相对其他的是贵很多,不过质量确实不错),一年7200。 9M的带宽1年每秒都跑满一年下来的流量是 9M/8×3600秒×24小时×30天X12月=34171 GB 如果完全按照流量算钱的话 34171GBX0.8 3501个实例一年的价格=2万7左右,相当于是3.75倍的价格。 你全天24小时的平均流量大小没有到25%那么是能省钱,如果超过了的话不如直接把2个VM的带宽增加一下划算。 对于一些下载类的放CDN是划算的,其他的如果业务高可用性要求高的也是需要用SLB的。 ------------------------- Re回3楼x00x的帖子 是的 所以一是先自己根据自己的业务量预算好要用多少机器 二是计算不同方案自己的开销。 看怎么搞能省点钱。 引用第4楼geekfans于2014-02-21 22:22发表的 回3楼x00x的帖子 : 乞丐版的CPUP和内存都太低了,SLB还是要用服务器的CPU和内存啊

x00x 2019-12-02 02:44:26 0 浏览量 回答数 0

回答

信息量太少个人开发,建议弄个Lamp/Wamp的套件包phpDesigner8用这个,可以直接调试. <spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:normal;background-color:#FFFFFF;">Wamp直接安装、完了之后用sublime编辑就好了!xampp套件,一步到位,然后就只需要Notepad了。。。。wampserver<atarget="_blank"rel="nofollow">http://sourceforge.net/projects/wampserver/ HeidiSQL<atarget="_blank"rel="nofollow">http://www.heidisql.com/downloads/HeidiSQL_8.1_Portable.zipNetbeansIDEPHP (下HTML5&PHP那个60M的Netbeans)<atarget="_blank"rel="nofollow">https://netbeans.org/downloads/index.htmlNotepad++<atarget="_blank"rel="nofollow">http://notepad-plus-plus.org/download/Firefox<atarget="_blank"rel="nofollow">http://www.firefox.com.cn/download/Chrome<atarget="_blank"rel="nofollow">http://soft.hao123.com/soft/appid/881.htmlhttp://anmpp.net/(手机上搭建个php环境,局域网测试代码无压力)128mb内存的安卓手机怎么玩,后台还要挂个qq,有时还得上浏览器 我现在搭建的是eclipsephpstudio2008,不知道哪位知道怎么配置apache,我配置了但是写的php文件,在浏览器里没有内容输出,只是一片空白.下个vertrigoServ,什么都解决了,把项目放到vertrigoserv的www文件夹下,直接在浏览器访问 要偷懒请用wamp+集成开发环境 要钻研请手工整lamp或wamp,用文本编辑器 要实用省心请钻研过后偷懒 apache可以用nginx替代,虽然频繁修改会不怎么稳定。

爱吃鱼的程序员 2020-06-22 14:19:48 0 浏览量 回答数 0

问题

每个月300多的ECS竟然遇到DDOS攻击就进黑洞

66分享网 2019-12-01 21:10:20 7996 浏览量 回答数 6

回答

点击后disabled掉,回调回来再重置回来######前端不限制?######我觉得这个还是前端做限制会比较合适,如果后端的 话  我暂时想到的就是ip过滤  每个IP在指定的时间内只能访问几次    不过感觉这样有点浪费资源###### 需要前后端一起限制 1.前端限制,点击后disabled掉,回调回来或者超时再重置回来 2.后端,限制用户只能在一定时间内访问该接口一次,可以借助redis的字符串的类型的SETNX 命令。 请求进入在redis中计数,后续请求直接返回,查询redis有值就返回失败,处理完毕删除redis的值 ######这个怎么限制在一定时间内哪?######你的问题有两种理解方式 第一种:用户点击N次 然后后台排队按照点击次数,一次一次的执行;第二种:用户点击n次,只执行第一次点击,其余的都不执行; 如果是第二种:你只需要在后台设置一个变量 用这个值做判断就行了  后台在执行点击指令时 把他的值修改  防止第二次点击命令进来,然后执行完成后将值恢复。至于第一种 我对java没什么了解 但是我觉得应该可以利用类似列队的方式来解决######1.后台加锁机制 2.点击之后设置为disable,等到请求结束返回信息再设置为disable, ######后端可以编码限定请求频率,例如Guava的RateLimiter。或者通过Ngnix限制###### 加一个过滤器,每次请求到的时候给 session 里面设置一个时间戳,返回的时候 removeSession 中这个值,如果第二个请求来了判断 session 里面时间戳是否满足了时间间隔,如果不满足,就直接返回一个提示,提交太频繁 ######刚看是 app,这样的话就直接记录针对设备或账号设置一个最后请求的时间戳,然后对比,一样的道理,完全可以放内存里面,每次只为一个账号保留一个时间戳就行了,也用不了多大内存######我遇到这种问题都是最简单的方法, 存session个值, 当然一个用户换个浏览器就不好用了, 或者缓存 用户名和状态, 主要还是要前台限制, 如果是定时操作, 可以用settimeout代替用户操作######突然想到  每次请求返回一个只能使用一次的随机值  处理请求前先比对该值  不知道行不行

kun坤 2020-05-30 17:26:57 0 浏览量 回答数 0

问题

新购买的全能运行环境(Windows Server 2008 R2企业版)无法联网

上海超马 2019-12-01 22:00:57 2577 浏览量 回答数 3

回答

作者:谢科链接:https://www.zhihu.com/question/20899988/answer/24923424来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。“入门”是良好的动机,但是可能作用缓慢。如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习。另外如果说知识体系里的每一个知识点是图里的点,依赖关系是边的话,那么这个图一定不是一个有向无环图。因为学习A的经验可以帮助你学习B。因此,你不需要学习怎么样“入门”,因为这样的“入门”点根本不存在!你需要学习的是怎么样做一个比较大的东西,在这个过程中,你会很快地学会需要学会的东西的。当然,你可以争论说需要先懂python,不然怎么学会python做爬虫呢?但是事实上,你完全可以在做这个爬虫的过程中学习python :D看到前面很多答案都讲的“术”——用什么软件怎么爬,那我就讲讲“道”和“术”吧——爬虫怎么工作以及怎么在python实现。先长话短说summarize一下:你需要学习基本的爬虫工作原理基本的http抓取工具,scrapyBloom Filter: Bloom Filters by Example如果需要大规模网页抓取,你需要学习分布式爬虫的概念。其实没那么玄乎,你只要学会怎样维护一个所有集群机器能够有效分享的分布式队列就好。最简单的实现是python-rq: https://github.com/nvie/rqrq和Scrapy的结合:darkrho/scrapy-redis · GitHub后续处理,网页析取(grangier/python-goose · GitHub),存储(Mongodb)以下是短话长说:说说当初写的一个集群爬下整个豆瓣的经验吧。1)首先你要明白爬虫怎样工作。想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。那么在python里怎么实现呢?很简单import Queueinitial_page = "http://www.renminribao.com"url_queue = Queue.Queue()seen = set()seen.insert(initial_page)url_queue.put(initial_page)while(True): #一直进行直到海枯石烂if url_queue.size()>0: current_url = url_queue.get() #拿出队例中第一个的url store(current_url) #把这个url代表的网页存储好 for next_url in extract_urls(current_url): #提取把这个url里链向的url if next_url not in seen: seen.put(next_url) url_queue.put(next_url) else: break写得已经很伪代码了。所有的爬虫的backbone都在这里,下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发。2)效率如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容。更别说Google这样的搜索引擎需要爬下全网的内容了。问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了。设想全网有N个网站,那么分析一下判重的复杂度就是N*log(N),因为所有网页要遍历一次,而每次判重用set的话需要log(N)的复杂度。OK,OK,我知道python的set实现是hash——不过这样还是太慢了,至少内存使用效率不高。通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种hash的方法,但是它的特点是,它可以使用固定的内存(不随url的数量而增长)以O(1)的效率判定url是否已经在set中。可惜天下没有白吃的午餐,它的唯一问题在于,如果这个url不在set中,BF可以100%确定这个url没有看过。但是如果这个url在set中,它会告诉你:这个url应该已经出现过,不过我有2%的不确定性。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少。一个简单的教程:Bloom Filters by Example注意到这个特点,url如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死)。但是如果没被看过,一定会被看一下(这个很重要,不然我们就要漏掉一些网页了!)。 [IMPORTANT: 此段有问题,请暂时略过]好,现在已经接近处理判重最快的方法了。另外一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度。用一台机子不够的话——用很多台吧!当然,我们假设每台机子都已经进了最大的效率——使用多线程(python的话,多进程吧)。3)集群化抓取爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月。想象如果只用一台机子你就得运行100个月了...那么,假设你现在有100台机器可以用,怎么用python实现一个分布式的爬取算法呢?我们把这100台中的99台运算能力较小的机器叫作slave,另外一台较大的机器叫作master,那么回顾上面代码中的url_queue,如果我们能把这个queue放到这台master机器上,所有的slave都可以通过网络跟master联通,每当一个slave完成下载一个网页,就向master请求一个新的网页来抓取。而每次slave新抓到一个网页,就把这个网页上所有的链接送到master的queue里去。同样,bloom filter也放到master上,但是现在master只发送确定没有被访问过的url给slave。Bloom Filter放到master的内存里,而被访问过的url放到运行在master上的Redis里,这样保证所有操作都是O(1)。(至少平摊是O(1),Redis的访问效率见:LINSERT – Redis)考虑如何用python实现:在各台slave上装好scrapy,那么各台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队列。代码于是写成#slave.pycurrent_url = request_from_master()to_send = []for next_url in extract_urls(current_url):to_send.append(next_url) store(current_url);send_to_master(to_send)master.pydistributed_queue = DistributedQueue()bf = BloomFilter()initial_pages = "www.renmingribao.com"while(True):if request == 'GET': if distributed_queue.size()>0: send(distributed_queue.get()) else: break elif request == 'POST': bf.put(request.url) 好的,其实你能想到,有人已经给你写好了你需要的:darkrho/scrapy-redis · GitHub4)展望及后处理虽然上面用很多“简单”,但是真正要实现一个商业规模可用的爬虫并不是一件容易的事。上面的代码用来爬一个整体的网站几乎没有太大的问题。但是如果附加上你需要这些后续处理,比如有效地存储(数据库应该怎样安排)有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...及时更新(预测这个网页多久会更新一次)

xuning715 2019-12-02 01:10:18 0 浏览量 回答数 0

问题

给新手站长的建议!建站有风险、入行需谨慎

ltw835765866 2019-12-01 21:41:54 8243 浏览量 回答数 11

回答

面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了。第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒。 你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对 es 确实玩儿的不怎么样? 面试题剖析 说实话,es 性能优化是没有什么银弹的,啥意思呢?就是不要期待着随手调一个参数,就可以万能的应对所有的性能慢的场景。也许有的场景是你换个参数,或者调整一下语法,就可以搞定,但是绝对不是所有场景都可以这样。 性能优化的杀手锏——filesystem cache 你往 es 里写的数据,实际上都写到磁盘文件里去了,查询的时候,操作系统会将磁盘文件里的数据自动缓存到 filesystem cache 里面去。 es 的搜索引擎严重依赖于底层的 filesystem cache,你如果给 filesystem cache 更多的内存,尽量让内存可以容纳所有的 idx segment file 索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。 性能差距究竟可以有多大?我们之前很多的测试和压测,如果走磁盘一般肯定上秒,搜索性能绝对是秒级别的,1秒、5秒、10秒。但如果是走 filesystem cache,是走纯内存的,那么一般来说性能比走磁盘要高一个数量级,基本上就是毫秒级的,从几毫秒到几百毫秒不等。 这里有个真实的案例。某个公司 es 节点有 3 台机器,每台机器看起来内存很多,64G,总内存就是 64 * 3 = 192G。每台机器给 es jvm heap 是 32G,那么剩下来留给 filesystem cache 的就是每台机器才 32G,总共集群里给 filesystem cache 的就是 32 * 3 = 96G 内存。而此时,整个磁盘上索引数据文件,在 3 台机器上一共占用了 1T 的磁盘容量,es 数据量是 1T,那么每台机器的数据量是 300G。这样性能好吗? filesystem cache 的内存才 100G,十分之一的数据可以放内存,其他的都在磁盘,然后你执行搜索操作,大部分操作都是走磁盘,性能肯定差。 归根结底,你要让 es 性能要好,最佳的情况下,就是你的机器的内存,至少可以容纳你的总数据量的一半。 根据我们自己的生产环境实践经验,最佳的情况下,是仅仅在 es 中就存少量的数据,就是你要用来搜索的那些索引,如果内存留给 filesystem cache 的是 100G,那么你就将索引数据控制在 100G 以内,这样的话,你的数据几乎全部走内存来搜索,性能非常之高,一般可以在 1 秒以内。 比如说你现在有一行数据。id,name,age .... 30 个字段。但是你现在搜索,只需要根据 id,name,age 三个字段来搜索。如果你傻乎乎往 es 里写入一行数据所有的字段,就会导致说 90% 的数据是不用来搜索的,结果硬是占据了 es 机器上的 filesystem cache 的空间,单条数据的数据量越大,就会导致 filesystem cahce 能缓存的数据就越少。其实,仅仅写入 es 中要用来检索的少数几个字段就可以了,比如说就写入 es id,name,age 三个字段,然后你可以把其他的字段数据存在 mysql/hbase 里,我们一般是建议用 es + hbase 这么一个架构。 hbase 的特点是适用于海量数据的在线存储,就是对 hbase 可以写入海量数据,但是不要做复杂的搜索,做很简单的一些根据 id 或者范围进行查询的这么一个操作就可以了。从 es 中根据 name 和 age 去搜索,拿到的结果可能就 20 个 doc id,然后根据 doc id 到 hbase 里去查询每个 doc id 对应的完整的数据,给查出来,再返回给前端。 写入 es 的数据最好小于等于,或者是略微大于 es 的 filesystem cache 的内存容量。然后你从 es 检索可能就花费 20ms,然后再根据 es 返回的 id 去 hbase 里查询,查 20 条数据,可能也就耗费个 30ms,可能你原来那么玩儿,1T 数据都放 es,会每次查询都是 5~10s,现在可能性能就会很高,每次查询就是 50ms。 数据预热 假如说,哪怕是你就按照上述的方案去做了,es 集群中每个机器写入的数据量还是超过了 filesystem cache 一倍,比如说你写入一台机器 60G 数据,结果 filesystem cache 就 30G,还是有 30G 数据留在了磁盘上。 其实可以做数据预热。 举个例子,拿微博来说,你可以把一些大V,平时看的人很多的数据,你自己提前后台搞个系统,每隔一会儿,自己的后台系统去搜索一下热数据,刷到 filesystem cache 里去,后面用户实际上来看这个热数据的时候,他们就是直接从内存里搜索了,很快。 或者是电商,你可以将平时查看最多的一些商品,比如说 iphone 8,热数据提前后台搞个程序,每隔 1 分钟自己主动访问一次,刷到 filesystem cache 里去。 对于那些你觉得比较热的、经常会有人访问的数据,最好做一个专门的缓存预热子系统,就是对热数据每隔一段时间,就提前访问一下,让数据进入 filesystem cache 里面去。这样下次别人访问的时候,性能一定会好很多。 冷热分离 es 可以做类似于 mysql 的水平拆分,就是说将大量的访问很少、频率很低的数据,单独写一个索引,然后将访问很频繁的热数据单独写一个索引。最好是将冷数据写入一个索引中,然后热数据写入另外一个索引中,这样可以确保热数据在被预热之后,尽量都让他们留在 filesystem os cache 里,别让冷数据给冲刷掉。 你看,假设你有 6 台机器,2 个索引,一个放冷数据,一个放热数据,每个索引 3 个 shard。3 台机器放热数据 index,另外 3 台机器放冷数据 index。然后这样的话,你大量的时间是在访问热数据 index,热数据可能就占总数据量的 10%,此时数据量很少,几乎全都保留在 filesystem cache 里面了,就可以确保热数据的访问性能是很高的。但是对于冷数据而言,是在别的 index 里的,跟热数据 index 不在相同的机器上,大家互相之间都没什么联系了。如果有人访问冷数据,可能大量数据是在磁盘上的,此时性能差点,就 10% 的人去访问冷数据,90% 的人在访问热数据,也无所谓了。 document 模型设计 对于 MySQL,我们经常有一些复杂的关联查询。在 es 里该怎么玩儿,es 里面的复杂的关联查询尽量别用,一旦用了性能一般都不太好。 最好是先在 Java 系统里就完成关联,将关联好的数据直接写入 es 中。搜索的时候,就不需要利用 es 的搜索语法来完成 join 之类的关联搜索了。 document 模型设计是非常重要的,很多操作,不要在搜索的时候才想去执行各种复杂的乱七八糟的操作。es 能支持的操作就那么多,不要考虑用 es 做一些它不好操作的事情。如果真的有那种操作,尽量在 document 模型设计的时候,写入的时候就完成。另外对于一些太复杂的操作,比如 join/nested/parent-child 搜索都要尽量避免,性能都很差的。 分页性能优化 es 的分页是较坑的,为啥呢?举个例子吧,假如你每页是 10 条数据,你现在要查询第 100 页,实际上是会把每个 shard 上存储的前 1000 条数据都查到一个协调节点上,如果你有个 5 个 shard,那么就有 5000 条数据,接着协调节点对这 5000 条数据进行一些合并、处理,再获取到最终第 100 页的 10 条数据。 分布式的,你要查第 100 页的 10 条数据,不可能说从 5 个 shard,每个 shard 就查 2 条数据,最后到协调节点合并成 10 条数据吧?你必须得从每个 shard 都查 1000 条数据过来,然后根据你的需求进行排序、筛选等等操作,最后再次分页,拿到里面第 100 页的数据。你翻页的时候,翻的越深,每个 shard 返回的数据就越多,而且协调节点处理的时间越长,非常坑爹。所以用 es 做分页的时候,你会发现越翻到后面,就越是慢。 我们之前也是遇到过这个问题,用 es 作分页,前几页就几十毫秒,翻到 10 页或者几十页的时候,基本上就要 5~10 秒才能查出来一页数据了。 有什么解决方案吗? 不允许深度分页(默认深度分页性能很差) 跟产品经理说,你系统不允许翻那么深的页,默认翻的越深,性能就越差。 类似于 app 里的推荐商品不断下拉出来一页一页的 类似于微博中,下拉刷微博,刷出来一页一页的,你可以用 scroll api,关于如何使用,自行上网搜索。 scroll 会一次性给你生成所有数据的一个快照,然后每次滑动向后翻页就是通过游标 scroll_id 移动,获取下一页下一页这样子,性能会比上面说的那种分页性能要高很多很多,基本上都是毫秒级的。 但是,唯一的一点就是,这个适合于那种类似微博下拉翻页的,不能随意跳到任何一页的场景。也就是说,你不能先进入第 10 页,然后去第 120 页,然后又回到第 58 页,不能随意乱跳页。所以现在很多产品,都是不允许你随意翻页的,app,也有一些网站,做的就是你只能往下拉,一页一页的翻。 初始化时必须指定 scroll 参数,告诉 es 要保存此次搜索的上下文多长时间。你需要确保用户不会持续不断翻页翻几个小时,否则可能因为超时而失败。 除了用 scroll api,你也可以用 search_after 来做,search_after 的思想是使用前一页的结果来帮助检索下一页的数据,显然,这种方式也不允许你随意翻页,你只能一页页往后翻。初始化时,需要使用一个唯一值的字段作为 sort 字段。 往期回顾: 【Java问答学堂】1期 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景? 【Java问答学堂】2期 如何保证消息队列的高可用? 【Java问答学堂】3期 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 【Java问答学堂】4期 如何保证消息的可靠性传输?(如何处理消息丢失的问题?) 【Java问答学堂】5期 如何保证消息的顺序性? 【Java问答学堂】6期 如何解决消息队列的延时以及过期失效问题? 【Java问答学堂】7期 如果让你写一个消息队列,该如何进行架构设计? 【Java问答学堂】8期 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)? 【Java问答学堂】9期 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?

剑曼红尘 2020-04-28 14:17:05 0 浏览量 回答数 0

问题

【Java问答学堂】10期 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

剑曼红尘 2020-04-28 14:16:56 0 浏览量 回答数 1

回答

1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来。想抓取什么?这个由你来控制它咯。 比如它在抓取一个网页,在这个网中他发现了一条道路,其实就是指向网页的超链接,那么它就可以爬到另一张网上来获取数据。这样,整个连在一起的大网对这之蜘蛛来说触手可及,分分钟爬下来不是事儿。 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以及百度搜索框,这个过程其实就是用户输入网址之后,经过DNS服务器,找到服务器主机,向服务器发出一个请求,服务器经过解析之后,发送给用户的浏览器 HTML、JS、CSS 等文件,浏览器解析出来,用户便可以看到形形色色的图片了。 因此,用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容,通过分析和过滤这些 HTML 代码,实现对图片、文字等资源的获取。 3.URL的含义 URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。 URL的格式由三部分组成:①第一部分是协议(或称为服务方式)。②第二部分是存有该资源的主机IP地址(有时也包括端口号)。③第三部分是主机资源的具体地址,如目录和文件名等。爬虫爬取数据时必须要有一个目标的URL才可以获取数据,因此,它是爬虫获取数据的基本依据,准确理解它的含义对爬虫学习有很大帮助。 环境的配置 学习Python,当然少不了环境的配置,最初我用的是Notepad++,不过发现它的提示功能实在是太弱了,于是,在Windows下我用了 PyCharm,在Linux下我用了Eclipse for Python,另外还有几款比较优秀的IDE,大家可以参考这篇文章 学习Python推荐的IDE 。好的开发工具是前进的推进器,希望大家可以找到适合自己的IDE 作者:谢科链接:https://www.zhihu.com/question/20899988/answer/24923424来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 “入门”是良好的动机,但是可能作用缓慢。如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习。另外如果说知识体系里的每一个知识点是图里的点,依赖关系是边的话,那么这个图一定不是一个有向无环图。因为学习A的经验可以帮助你学习B。因此,你不需要学习怎么样“入门”,因为这样的“入门”点根本不存在!你需要学习的是怎么样做一个比较大的东西,在这个过程中,你会很快地学会需要学会的东西的。当然,你可以争论说需要先懂python,不然怎么学会python做爬虫呢?但是事实上,你完全可以在做这个爬虫的过程中学习python :D看到前面很多答案都讲的“术”——用什么软件怎么爬,那我就讲讲“道”和“术”吧——爬虫怎么工作以及怎么在python实现。先长话短说summarize一下:你需要学习基本的爬虫工作原理基本的http抓取工具,scrapyBloom Filter: Bloom Filters by Example如果需要大规模网页抓取,你需要学习分布式爬虫的概念。其实没那么玄乎,你只要学会怎样维护一个所有集群机器能够有效分享的分布式队列就好。最简单的实现是python-rq: https://github.com/nvie/rqrq和Scrapy的结合:darkrho/scrapy-redis · GitHub后续处理,网页析取(grangier/python-goose · GitHub),存储(Mongodb)以下是短话长说:说说当初写的一个集群爬下整个豆瓣的经验吧。1)首先你要明白爬虫怎样工作。想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。那么在python里怎么实现呢?很简单import Queue initial_page = "http://www.renminribao.com" url_queue = Queue.Queue()seen = set() seen.insert(initial_page)url_queue.put(initial_page) while(True): #一直进行直到海枯石烂 if url_queue.size()>0: current_url = url_queue.get() #拿出队例中第一个的url store(current_url) #把这个url代表的网页存储好 for next_url in extract_urls(current_url): #提取把这个url里链向的url if next_url not in seen: seen.put(next_url) url_queue.put(next_url) else: break 写得已经很伪代码了。所有的爬虫的backbone都在这里,下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发。2)效率如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容。更别说Google这样的搜索引擎需要爬下全网的内容了。问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了。设想全网有N个网站,那么分析一下判重的复杂度就是N*log(N),因为所有网页要遍历一次,而每次判重用set的话需要log(N)的复杂度。OK,OK,我知道python的set实现是hash——不过这样还是太慢了,至少内存使用效率不高。通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种hash的方法,但是它的特点是,它可以使用固定的内存(不随url的数量而增长)以O(1)的效率判定url是否已经在set中。可惜天下没有白吃的午餐,它的唯一问题在于,如果这个url不在set中,BF可以100%确定这个url没有看过。但是如果这个url在set中,它会告诉你:这个url应该已经出现过,不过我有2%的不确定性。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少。一个简单的教程:Bloom Filters by Example注意到这个特点,url如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死)。但是如果没被看过,一定会被看一下(这个很重要,不然我们就要漏掉一些网页了!)。 [IMPORTANT: 此段有问题,请暂时略过]好,现在已经接近处理判重最快的方法了。另外一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度。用一台机子不够的话——用很多台吧!当然,我们假设每台机子都已经进了最大的效率——使用多线程(python的话,多进程吧)。3)集群化抓取爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月。想象如果只用一台机子你就得运行100个月了...那么,假设你现在有100台机器可以用,怎么用python实现一个分布式的爬取算法呢?我们把这100台中的99台运算能力较小的机器叫作slave,另外一台较大的机器叫作master,那么回顾上面代码中的url_queue,如果我们能把这个queue放到这台master机器上,所有的slave都可以通过网络跟master联通,每当一个slave完成下载一个网页,就向master请求一个新的网页来抓取。而每次slave新抓到一个网页,就把这个网页上所有的链接送到master的queue里去。同样,bloom filter也放到master上,但是现在master只发送确定没有被访问过的url给slave。Bloom Filter放到master的内存里,而被访问过的url放到运行在master上的Redis里,这样保证所有操作都是O(1)。(至少平摊是O(1),Redis的访问效率见:LINSERT – Redis)考虑如何用python实现:在各台slave上装好scrapy,那么各台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队列。代码于是写成#slave.py current_url = request_from_master()to_send = []for next_url in extract_urls(current_url): to_send.append(next_url) store(current_url);send_to_master(to_send) master.py distributed_queue = DistributedQueue()bf = BloomFilter() initial_pages = "www.renmingribao.com" while(True): if request == 'GET': if distributed_queue.size()>0: send(distributed_queue.get()) else: break elif request == 'POST': bf.put(request.url) 好的,其实你能想到,有人已经给你写好了你需要的:darkrho/scrapy-redis · GitHub4)展望及后处理虽然上面用很多“简单”,但是真正要实现一个商业规模可用的爬虫并不是一件容易的事。上面的代码用来爬一个整体的网站几乎没有太大的问题。但是如果附加上你需要这些后续处理,比如有效地存储(数据库应该怎样安排)有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...及时更新(预测这个网页多久会更新一次)

xuning715 2019-12-02 01:10:40 0 浏览量 回答数 0

问题

ES 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?【Java问答学堂】28期

剑曼红尘 2020-05-28 09:45:28 15 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播