数据分发shell小脚本

在Linux系统下,当一个文件夹下的文件过多,则文件列表读取会很慢,而且不利于进行cp 或mv 操作,应对与此,我们通过一个分发脚本程序对指定文件夹的数据进行分发,重新分配到多个文件夹下。 #! /bin/sh       ###########################################    scrDir=/data/path/    splitNum=3       count=1    while true; do       FileList =`ls $scrDir|grep txt`        if [ -z "$FileList" ]        then            #The filelist is empty, sleep 10s            sleep 10s        else           #The folder has files, so mv it            for FILE in $FileList           do               if [ $count -gt $splitNum ]                then                    count=1                fi                mkdir -p $scrDir$count‘/’ … 继续阅读

Tomcat+Solr配置安装

【版本】Java JDK: 1.8.25, Tomcat: 8.0.11, Solr: 4.9. 1. 从网上下载Tomcat最新版本,解压; 2. 定制端口号:修改./tomcat/conf/server.xml 中的所有端口 8*** 改为 7***(只要是端口都要进行改动); 3. 修改Tomcat 连接超时 和 编码格式: </Connector port=”7080″ protocol=”HTTP/1.1″ connectionTimeout=”1000000″ redirectPort=”7443″ maxPostSize=”0″ URIEncoding=”UTF-8″/> 4. Tomcat下安装Solr,Copy solr-4.9.0\example\webapps\solr.war 到apache-tomcat-8.0.11_analysis_7080\webapps 目录下,然后启动apache-tomcat-8.0.11_analysis_7080\bin\startup.bat ,则solr.war可以自动解压到tomcat里面,然后删除solr.war; 5. 修改实例名-文件夹名solr 为 analysisNorm001; 6. 订制apache-tomcat-8.0.11_analysis_7080\webapps\analysisNorm001\WEB-INF\web.xml中的solrHome路径 <env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>../webapps/analysisNorm001/solrHome/</env-entry-value> … 继续阅读

MPI及并行化积分运算

参考:1. MPI编程 – http://blog.csdn.net/gexplore/article/details/7078832 2. MPI 实现梯形积分法 – http://blog.csdn.net/u012417189/article/details/25717263 1. MPI简介 多线程是一种便捷的模型,其中每个线程都可以访问其它线程的存储空间。因此,这种模型只能在共享存储系统之间移植。一般来讲,并行机不一定在各处理 器之间共享存储,当面向非共享存储系统开发并行程序时,程序的各部分之间通过来回传递消息的方式通信。要使得消息传递方式可移植,就需要采用标准的消息传 递库。这就促成的消息传递接口(Message Passing Interface, MPI)的面世,MPI是一种被广泛采用的消息传递标准。 与OpenMP并行程序不同,MPI是一种基于消息传递的并行编程技术。消息传递接口是一种编程接口标准,而不是一种具体的编程语言。简而言之,MPI标准定义了一组具有可移植性的编程接口。各个厂商或组织遵循这些标准实现自己的MPI软件包,典型的实现包括开放源代码的MPICH、LAM MPI以及不开放源代码的Intel MPI。由于MPI提供了统一的编程接口,程序员只需要设计好并行算法,使用相应的MPI库就可以实现基于消息传递的并行计算。MPI支持多种操作系统,包括大多数的类UNIX和Windows系统。 2. 基本接口函数 int _t main(int argc, _TCHAR* argv[]){           int rank, size;        MPI_Init(&argc, &argv);        MPI_Comm_rank(MPI_COMM_WORLD, &rank);        MPI_Comm_size(MPI_COMM_WORLD, &size);        printf(“Hello World from thread %d of %d\n”, rank, size);        MPI_Finalize();        return 0;    }   这个程序比较简单,在函数MPI_Init()和MPI_Finalize()之间是程序并行执行的地方 … 继续阅读

Ubuntu 14.04下NFS安装配置

参考:http://www.linuxidc.com/Linux/2013-08/89154.htm 1、执行命令:sudo apt-get install nfs-kernel-server ; 2、执行命令:mkdir /home/jacobxu/nfs-jacoxu 建立一个nfs服务的专有的文件夹; 3、建立好文件夹后,接着执行命令:sudo vi /etc/exports 配置nfs; 4、在文章的最后一行添加:/home/jacobxu/nfs-jacoxu *(rw,sync,no_root_squash,no_subtree_check) /home/jacobxu/nfs-jacoxu *(rw,sync,no_root_squash,no_subtree_check)这一行的含义是: /home/jacobxu/nfs-jacoxu:与nfs服务客户端共享的目录,这个路径必须和你前面设置的文件的路径一致! *:允许所有的网段访问,也可以使用具体的IP rw:挂接此目录的客户端对该共享目录具有读写权限 sync:资料同步写入内存和硬盘 no_root_squash:root用户具有对根目录的完全管理访问权限。 no_subtree_check:不检查父目录的权限。 5、修改完上述配置文件保存退出。 6、执行命令:sudo /etc/init.d/rpcbind restart 重启rpcbind 服务。nfs是一个RPC程序,使用它前,需要映射好端口,通过rpcbind 设定。 7、执行命令:sudo /etc/init.d/nfs-kernel-server restart 重启nfs服务。 8、挂载指令: sudo mount -t nfs 192.168.111.128:/home/jacobxu/nfs-jacoxu … 继续阅读

Hadoop 2.4.1在Ubuntu14.04上的集群配置

本文主要参考:1. http://blog.csdn.net/ab198604/article/details/8250461 (比较喜欢此作者通俗的写风,哈哈,所以整张篇幅大量粘贴他的内容) 2. http://os.51cto.com/art/201309/411793_all.htm 3. http://gxl-ct001.iteye.com/blog/1982910 4. http://www.cnblogs.com/tippoint/archive/2012/10/23/2735532.html 5. http://www.cnblogs.com/lanxuezaipiao/p/3525554.html 6. http://blog.csdn.net/skywalker_only/article/details/37905463 7. http://chj738871937.iteye.com/blog/2088735 8. http://blog.chinaunix.net/uid-20682147-id-4229024.html#_Toc807 9. http://ca.xcl0ud.net/wp-content/uploads/2014/05/Hadoop-2.pdf 目录: 一、引言 二、准备工作 三、配置hosts文件 四、建立hadoop运行帐号 五、配置ssh免密码连入 六、下载并解压hadoop安装包 七、配置namenode,修改site文件 八、配置hadoop-env.sh文件 九、配置slaves文件 十、向各节点复制hadoop 十一、格式化namenode 十二、启动HDFS 十三、启动YARN 十四、通过网站查看集群情况 一、引言 Hadoop是一种分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力高速运算和存储。Hadoop 发布的版本下载地址:http://apache.communilink.net/hadoop/common/ Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统HDFS(Hadoop Distributed Filesystem)和MapReduce(Google … 继续阅读

Matlab下大矩阵运算

通过memory和whos可以看到当前系统的内存使用情况和每个变量所占用的内存,例如: K>> memory    Maximum possible array:               7414 MB (7.774e+009 bytes) *    Memory available for all arrays:      7414 MB (7.774e+009 bytes) *    Memory used by MATLAB:                2433 MB (2.552e+009 bytes)    Physical Memory (RAM):                5823 MB (6.106e+009 bytes)       *  Limited by System Memory (physical + swap file) available.   可以看到本地机器的物理内存RAM有将近6G,最大可能内存7G左右,目前已经被Matlab使用的内存有2G多,通过whos指令可以知道有那些变量占用的内存比较大: K>> whos      Name                      Size                    Bytes  Class     Attributes            temp_instance_2       20229×10059            1627868088  double                    temp_instance_3       20229×10059               2095424  double    sparse                      train_data                1×10059              86199419  struct                 可以看到同样20139*10059的矩阵,double型的full矩阵要占用1.6G左右的内存,double型的sparse矩阵只占用了2M左右内存。 在运算速度方面 tic,toc来知道每段代码的执行时间。但要知道每条语句的详细运行情况的话,非profile莫属。先运行profile on,再运行需要测试的代码,然后使用profile viewer来查看报告。 Sparse矩阵在指定下标的循环运算中不占优势。但是,当一个矩阵中有大量的0时就一定要采用sparse型进行运算,不只大大减少内存会消耗,而且时间消耗也会大大减少。注意,一般Sparse矩阵运算如sum, diag等之后还是sparse矩阵,而当sparse矩阵和full矩阵一起参加运算时,结果会被强制转为full矩阵。要注意,当一个矩阵并不是很稀疏时尽量不要采用sparse方式存储,不便于矩阵运算,对于一些矩阵操作,如求矩阵转置等操作会变得异常异常的慢! 下面是一个2W*2W的double型全1矩阵full型和sparse型的占内存情况: >> A = ones(20229,20229);    >> whos      Name          Size                    Bytes  Class     Attributes       … 继续阅读

[zz]通过构树快速计算编辑距离

今晚微软编程题目中有一题:海量数据的相似字符串快速统计,复杂度希望能近似到线性。类似一个快速KNN的问题,快速统计方法分为近似与精确方法。近似方法属于ANN流派,而精确方法大多通过几何方法,如各种Tree,下面是Matrix67用中文介绍的一篇如何通过Tree来快速计算编辑距离的文章。 参考出处:1. http://www.matrix67.com/blog/archives/333 2. http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees =========================下为转载文章============================== 除了字符串匹配、查找回文串、查找重复子串等经典问题以外,日常生活中我们还会遇到其它一些怪异的字符串问题。比如,有时我们需要知道给定的两个字符串“有多像”,换句话说两个字符串的相似度是多少。1965年,俄国科学家Vladimir Levenshtein给字符串相似度做出了一个明确的定义叫做Levenshtein距离,我们通常叫它“编辑距离”。字符串A到B的编辑距离是指,只用插入、删除和替换三种操作,最少需要多少步可以把A变成B。例如,从FAME到GATE需要两步(两次替换),从GAME到ACM则需要三步(删除G和E再添加C)。Levenshtein给出了编辑距离的一般求法,就是大家都非常熟悉的经典动态规划问题。 在自然语言处理中,这个概念非常重要,例如我们可以根据这个定义开发出一套半自动的校对系统:查找出一篇文章里所有不在字典里的单词,然后对于每个单词,列出字典里与它的Levenshtein距离小于某个数n的单词,让用户选择正确的那一个。n通常取到2或者3,或者更好地,取该单词长度的1/4等等。这个想法倒不错,但算法的效率成了新的难题:查字典好办,建一个Trie树即可;但怎样才能快速在字典里找出最相近的单词呢?这个问题难就难在,Levenshtein的定义可以是单词任意位置上的操作,似乎不遍历字典是不可能完成的。现在很多软件都有拼写检查的功能,提出更正建议的速度是很快的。它们到底是怎么做的呢?1973年,Burkhard和Keller提出的BK树有效地解决了这个问题。这个数据结构强就强在,它初步解决了一个看似不可能的问题,而其原理非常简单。 首先,我们观察Levenshtein距离的性质。令d(x,y)表示字符串x到y的Levenshtein距离,那么显然: 1. d(x,y) = 0 当且仅当 x=y (Levenshtein距离为0 字符串相等) 2. d(x,y) = d(y,x) (从x变到y的最少步数就是从y变到x的最少步数) 3. d(x,y) + d(y,z) >= d(x,z) (从x变到z所需的步数不会超过x先变成y再变成z的步数) 最后这一个性质叫做三角形不等式。就好像一个三角形一样,两边之和必然大于第三边。给某个集合内的元素定义一个二元的“距离函数”,如果这个距离函数同时满足上面说的三个性质,我们就称它为“度量空间”。我们的三维空间就是一个典型的度量空间,它的距离函数就是点对的直线距离。度量空间还有很多,比如Manhattan距离,图论中的最短路,当然还有这里提到的Levenshtein距离。就好像并查集对所有等价关系都适用一样,BK树可以用于任何一个度量空间。 建树的过程有些类似于Trie。首先我们随便找一个单词作为根(比如GAME)。以后插入一个单词时首先计算单词与根的Levenshtein距离:如果这个距离值是该节点处头一次出现,建立一个新的儿子节点;否则沿着对应的边递归下去。例如,我们插入单词FAME,它与GAME的距离为1,于是新建一个儿子,连一条标号为1的边;下一次插入GAIN,算得它与GAME的距离为2,于是放在编号为2的边下。再下次我们插入GATE,它与GAME距离为1,于是沿着那条编号为1的边下去,递归地插入到FAME所在子树;GATE与FAME的距离为2,于是把GATE放在FAME节点下,边的编号为2。 查询操作异常方便。如果我们需要返回与错误单词距离不超过n的单词,这个错误单词与树根所对应的单词距离为d,那么接下来我们只需要递归地考虑编号在d-n到d+n范围内的边所连接的子树。由于n通常很小,因此每次与某个节点进行比较时都可以排除很多子树。 举个例子,假如我们输入一个GAIE,程序发现它不在字典中。现在,我们想返回字典中所有与GAIE距离为1的单词。我们首先将GAIE与树根进行比较,得到的距离d=1。由于Levenshtein距离满足三角形不等式,因此现在所有离GAME距离超过2的单词全部可以排除了。比如,以AIM为根的子树到GAME的距离都是3,而GAME和GAIE之间的距离是1,那么AIM及其子树到GAIE的距离至少都是2。于是,现在程序只需要沿着标号范围在1-1到1+1里的边继续走下去。我们继续计算GAIE和FAME的距离,发现它为2,于是继续沿标号在1和3之间的边前进。遍历结束后回到GAME的第二个节点,发现GAIE和GAIN距离为1,输出GAIN并继续沿编号为1或2的边递归下去(那条编号为4的边连接的子树又被排除掉了)…… 实践表明,一次查询所遍历的节点不会超过所有节点的5%到8%,两次查询则一般不会17-25%,效率远远超过暴力枚举。适当进行缓存,减小Levenshtein距离常数n可以使算法效率更高。

Deep paging problem of solr, start设置越大查询越慢

进行solr查询时,如果查询结果很多而且业务需求需要全部返回时,传统的搜索引擎都会遇到一个棘手的问题:deep paging problem,即当翻页查询越多时,查询响应时间越长。传统的搜索服务如Baidu,Google 一般只提供1000以内的查询结果共用户查阅,如果需要更多的查询结果,用户可以输入更多的查询语句进行筛选。 下面利用Apache Solr进行deep page查询的性能测试: 【测试数据】:规模: 499W,内容一样(饲荆泞琴哇尘自缕勇恩本灾却咀功害鳃踪羽甲沏馏铆级奉耻陷下龄周),时间不同。 【机器性能】:64G内存 Linux-Suse 【测试一,翻页查询499W所有结果】 查询条件为rows为10000,timeAllowed为86400000 (即为一天), content为 饲荆泞琴哇尘自缕,进行rows=1W的翻页查询,查询的相应时间如下: 原始结果数据 单次查询结果数 单次查询耗时/ms 查询后结果总数 10000 1585 10000 10000 1585 20000 10000 1682 30000 10000 1818 40000 10000 1934 50000 … 10000 100138 4950000 10000 … 继续阅读

Solr MultiCore LRU队列

当服务器资源有限但是加载的core特别多的时候怎么办?我们当然希望能够根据索引或查询请求而动态的加载卸载多核,https://issues.apache.org/jira/browse/SOLR-1293 给Solr4.2提供了一个补丁,能够在大规模cores上进行动态的加载卸载,可以参考框架:http://wiki.apache.org/solr/LotsOfCores LotsOfCores. 相关的配置很简单,Solr4.3以后的版本已经集成了此功能,目前我使用的是solr4.4版本,在solr.xml中配置如下: <?xml version=“1.0″ encoding=“UTF-8″ ?>   <solr persistent=“true”>     <cores transientCacheSize=“2″ adminPath=“/admin/cores”>       <core loadOnStartup=“true” instanceDir=“multicore/collection1970_01_1″ transient=“false” name=“core1970_01_1″/>       <core loadOnStartup=“false” instanceDir=“D:\jacoxu\solrHome\multicore\collection0004″ transient=“true” name=“core0004″/>       <core loadOnStartup=“false” instanceDir=“D:\jacoxu\solrHome\multicore\collection0005″ transient=“true” name=“core0005″/>       <core loadOnStartup=“false” instanceDir=“D:\jacoxu\solrHome\multicore\collection0006″ transient=“true” name=“core0006″/>       <core loadOnStartup=“false” instanceDir=“D:\jacoxu\solrHome\multicore\collection0007″ transient=“true” name=“core0007″/>     </cores>   </solr>   这也就是之前讲的删除一个core时,必须先进行一下query访问才能删除dataDir. Solr5.0版还没出,不过估计会有较大的改动。在上次讲过的利用solrj动态添加多核中可以设置新添加core的属性,loadOnStartup和transient属性,但是新添加的core并不参加LRU队列交换,直接修改solr源代码是一件冒险的事,一种可行的方法是进行定时进行tomcat重启操作,重启时要注意的是,在linux上,tomcat很有可能shutdown无效,那么需要进行强制Kill: public static void restartTomcat() {        if (SmsBase.osName==“windows”) {            String[] changePath_cmd = {                “cmd”,                “/c”,                 “cd ”+ SmsBase.tomcatPath,            };            String[] shutdown_cmd = {                “cmd”,                “/c”,                 “shutdown.bat”              };    … 继续阅读