首页 文章 精选 留言 我的

精选列表

搜索[优化],共10000篇文章
优秀的个人博客,低调大师

使用C#创建windows服务续之使用Topshelf优化Windows服务

前言: 之前写了一篇“使用C#创建windows服务”,https://www.cnblogs.com/huangwei1992/p/9693167.html,然后有博友给我推荐了一个开源框架Topshelf。 写了一点测试代码,发现Topshelf框架确实在创建windows服务上非常好用,于是就对我之前的代码进行了改造。 开发流程: 1.在不使用Topshelf框架的情况下,我们需要创建Windows服务程序,在这里我们只需要创建一个控制台程序就行了 2.添加引用 使用程序安装命令: Install-Package Topshelf 直接在NuGet包管理器中搜索Topshelf,点击安装即可: 3.新建核心类CloudImageManager 主要方法有三个:LoadCloudImage、Start、Stop,直接贴代码 /// <summary> /// 功能描述 :卫星云图下载管理器 /// 创 建 者 :Administrator /// 创建日期 :2018/9/25 14:29:03 /// 最后修改者 :Administrator /// 最后修改日期:2018/9/25 14:29:03 /// </summary> public class CloudImageManager { private string _ImagePath = System.Configuration.ConfigurationManager.AppSettings["Path"]; private Timer _Timer = null; private double Interval = double.Parse(System.Configuration.ConfigurationManager.AppSettings["Minutes"]); public CloudImageManager() { _Timer = new Timer(); _Timer.Interval = Interval * 60 * 1000; _Timer.Elapsed += _Timer_Elapsed; } void _Timer_Elapsed(object sender, ElapsedEventArgs e) { StartLoad(); } /// <summary> /// 开始下载云图 /// </summary> private void StartLoad() { LoadCloudImage(); } public void Start() { StartLoad(); _Timer.Start(); } public void Stop() { _Timer.Stop(); } /// <summary> /// 下载当天所有卫星云图 /// </summary> private void LoadCloudImage() { CreateFilePath();//判断文件夹是否存在,不存在则创建 //获取前一天日期 string lastYear = DateTime.Now.AddDays(-1).Year.ToString(); string lastMonth = DateTime.Now.AddDays(-1).Month.ToString(); if (lastMonth.Length < 2) lastMonth = "0" + lastMonth; string lastDay = DateTime.Now.AddDays(-1).Day.ToString(); if (lastDay.Length < 2) lastDay = "0" + lastDay; //获取当天日期 string year = DateTime.Now.Year.ToString(); string month = DateTime.Now.Month.ToString(); if (month.Length < 2) month = "0" + month; string day = DateTime.Now.Day.ToString(); if (day.Length < 2) day = "0" + day; //设置所有文件名 string[] dates0 = { lastYear + "/" + lastMonth + "/" + lastDay, year + "/" + month + "/" + day }; string[] dates = { lastYear + lastMonth + lastDay, year + month + day }; string[] hours = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" }; string[] minutes = { "15", "45" }; int hLength = hours.Count(); //遍历下载当天所有在线云图 for (int i = 0; i < 2; i++) { string date = dates[i]; string date0 = dates0[i]; for (int j = 0; j < hLength; j++) { string hour = hours[j]; for (int k = 0; k < 2; k++) { string minute = minutes[k]; string imageUrl = @"http://image.nmc.cn/product/" + date0 + @"/WXCL/SEVP_NSMC_WXCL_ASC_E99_ACHN_LNO_PY_" + date + hour + minute + "00000.JPG"; string[] s = imageUrl.Split('/'); string imageName = s[s.Count() - 1]; HttpWebRequest request = HttpWebRequest.Create(imageUrl) as HttpWebRequest; HttpWebResponse response = null; try { response = request.GetResponse() as HttpWebResponse; } catch (Exception) { continue; } if (response.StatusCode != HttpStatusCode.OK) continue; Stream reader = response.GetResponseStream(); FileStream writer = new FileStream(_ImagePath + imageName, FileMode.OpenOrCreate, FileAccess.Write); byte[] buff = new byte[512]; int c = 0; //实际读取的字节数 while ((c = reader.Read(buff, 0, buff.Length)) > 0) { writer.Write(buff, 0, c); } writer.Close(); writer.Dispose(); reader.Close(); reader.Dispose(); response.Close(); } } } } /// <summary> /// 判断文件夹是否存在,不存在则创建 /// </summary> private void CreateFilePath() { if (Directory.Exists(_ImagePath)) { ClearImages(); return; } else { Directory.CreateDirectory(_ImagePath); } } /// <summary> /// 清空文件夹下所有文件 /// </summary> private void ClearImages() { try { DirectoryInfo dir = new DirectoryInfo(_ImagePath); FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录 foreach (FileSystemInfo i in fileinfo) { if (i is DirectoryInfo) //判断是否文件夹 { DirectoryInfo subdir = new DirectoryInfo(i.FullName); subdir.Delete(true); //删除子目录和文件 } else { File.Delete(i.FullName); //删除指定文件 } } } catch (Exception e) { Console.WriteLine(e.Message); } } } 然后在Program.cs中调用: static void Main(string[] args) { HostFactory.Run(x => //1 { x.Service<CloudImageManager>(s => //2 { s.ConstructUsing(name => new CloudImageManager()); //3 s.WhenStarted(tc => tc.Start()); //4 s.WhenStopped(tc => tc.Stop()); //5 }); x.RunAsLocalSystem(); //6 x.SetDescription("卫星云图实时下载工具"); //7 x.SetDisplayName("CloudImageLoad"); //8 x.SetServiceName("CloudImageLoad"); //9 }); } 可以看到调用的时候主要涉及到CloudImageManager类中的构造函数、Start方法以及Stop方法 安装、运行和卸载: 在Topshelf框架下进行服务的这些操作相对而言就简单多了 安装:Topshelf.CloudImageLoad.exe install 启动:Topshelf.CloudImageLoad.exe start 卸载:Topshelf.CloudImageLoad.exe uninstall 操作界面如下:(注意:必须用管理员身份运行命令提示符) 在这里只贴出了安装命令的截图,其他命令相信就不用多说了。 查看服务列表,这时我们的服务就已经安装成功了 参考链接: http://www.cnblogs.com/jys509/p/4614975.html

优秀的个人博客,低调大师

Scikit中的特征选择,XGboost进行回归预测,模型优化的实战

前天偶然在一个网站上看到一个数据分析的比赛(sofasofa),自己虽然学习一些关于机器学习的内容,但是并没有在比赛中实践过,于是我带着一种好奇心参加了这次比赛。 赛题:足球运动员身价估计比赛概述 本比赛为个人练习赛,主要针对于于数据新人进行自我练习、自我提高,与大家切磋。 练习赛时限:2018-03-05 至 2020-03-05 任务类型:回归 背景介绍: 每个足球运动员在转会市场都有各自的价码。本次数据练习的目的是根据球员的各项信息和能力值来预测该球员的市场价值。 根据以上描述,我们很容易可以判断出这是一个回归预测类的问题。当然,要想进行预测,我们首先要做的就是先看看数据的格式以及内容(由于参数太多,我就不一一列举了,大家可以直接去网上看,下面我简单贴个图): 简单了解了数据的格式以及大小以后,由于没有实践经验,我就凭自己的感觉,单纯的认为一下几个字段可能是最重要的: 字段 含义 club 该球员所属的俱乐部。该信息已经被编码。 league 该球员所在的联赛。已被编码。 potential 球员的潜力。数值变量。 international_reputation 国际知名度。数值变量。 巧合的是刚好这些字段都没有缺失值,我很开心啊,心想着可以直接利用XGBoost模型进行预测了。具体XGBoost的使用方法,可以参考:XGBoost以及官方文档XGBoost Parameters。说来就来,我开始了coding工作,下面就贴出我的第一版代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : soccer_value.py # @Author: Huangqinjian # @Date : 2018/3/22 # @Desc : import pandas as pd import matplotlib.pyplot as plt import xgboost as xgb import numpy as np from xgboost import plot_importance from sklearn.preprocessing import Imputer def loadDataset(filePath): df = pd.read_csv(filepath_or_buffer=filePath) return df def featureSet(data): data_num = len(data) XList = [] for row in range(0, data_num): tmp_list = [] tmp_list.append(data.iloc[row]['club']) tmp_list.append(data.iloc[row]['league']) tmp_list.append(data.iloc[row]['potential']) tmp_list.append(data.iloc[row]['international_reputation']) XList.append(tmp_list) yList = data.y.values return XList, yList def loadTestData(filePath): data = pd.read_csv(filepath_or_buffer=filePath) data_num = len(data) XList = [] for row in range(0, data_num): tmp_list = [] tmp_list.append(data.iloc[row]['club']) tmp_list.append(data.iloc[row]['league']) tmp_list.append(data.iloc[row]['potential']) tmp_list.append(data.iloc[row]['international_reputation']) XList.append(tmp_list) return XList def trainandTest(X_train, y_train, X_test): # XGBoost训练过程 model = xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=False, objective='reg:gamma') model.fit(X_train, y_train) # 对测试集进行预测 ans = model.predict(X_test) ans_len = len(ans) id_list = np.arange(10441, 17441) data_arr = [] for row in range(0, ans_len): data_arr.append([int(id_list[row]), ans[row]]) np_data = np.array(data_arr) # 写入文件 pd_data = pd.DataFrame(np_data, columns=['id', 'y']) # print(pd_data) pd_data.to_csv('submit.csv', index=None) # 显示重要特征 # plot_importance(model) # plt.show() if __name__ == '__main__': trainFilePath = 'dataset/soccer/train.csv' testFilePath = 'dataset/soccer/test.csv' data = loadDataset(trainFilePath) X_train, y_train = featureSet(data) X_test = loadTestData(testFilePath) trainandTest(X_train, y_train, X_test) 然后我就把得到的结果文件submit.csv提交到网站上,看了结果,MAE为106.6977,排名24/28,很不理想。不过这也在预料之中,因为我基本没有进行特征处理。 我当然不满意啦,一直想着怎么能提高准确率呢?后来就想到了可以利用一下scikit这个库啊!在scikit中包含了一个特征选择的模块sklearn.feature_selection,而在这个模块下面有以下几个方法: Removing features with low variance(剔除低方差的特征) Univariate feature selection(单变量特征选择) Recursive feature elimination(递归功能消除) Feature selection using SelectFromModel(使用SelectFromModel进行特征选择) 我首先想到的是利用单变量特征选择的方法选出几个跟预测结果最相关的特征。根据官方文档,有以下几种得分函数来检验变量之间的依赖程度: 对于回归问题: f_regression, mutual_info_regression 对于分类问题: chi2, f_classif, mutual_info_classif 由于这个比赛是一个回归预测问题,所以我选择了f_regression这个得分函数(刚开始我没有注意,错误使用了分类问题中的得分函数chi2,导致程序一直报错!心很累~) f_regression的参数: sklearn.feature_selection.f_regression(X, y, center=True) X:一个多维数组,大小为(n_samples, n_features),即行数为训练样本的大小,列数为特征的个数y:一个一维数组,长度为训练样本的大小return:返回值为特征的F值以及p值 不过在进行这个操作之前,我们还有一个重大的任务要完成,那就是对于空值的处理!幸运的是scikit中也有专门的模块可以处理这个问题:Imputation of missing values sklearn.preprocessing.Imputer的参数:sklearn.preprocessing.Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True) 其中strategy代表对于空值的填充策略(默认为mean,即取所在列的平均数进行填充): strategy='median',代表取所在列的中位数进行填充 strategy='most_frequent', 代表取所在列的众数进行填充 axis默认值为0: axis=0,代表按列进行填充 axis=1,代表按行进行填充 其他具体参数可以参考:sklearn.preprocessing.Imputer 根据以上,我对数据进行了一些处理: from sklearn.feature_selection import f_regression from sklearn.preprocessing import Imputer imputer = Imputer(missing_values='NaN', strategy='mean', axis=0) imputer.fit(data.loc[:, 'rw':'lb']) x_new = imputer.transform(data.loc[:, 'rw':'lb']) data_num = len(x_new) XList = [] yList = [] for row in range(0, data_num): tmp_list = [] tmp_list.append(x_new[row][0]) tmp_list.append(x_new[row][1]) tmp_list.append(x_new[row][2]) tmp_list.append(x_new[row][3]) tmp_list.append(x_new[row][4]) tmp_list.append(x_new[row][5]) tmp_list.append(x_new[row][6]) tmp_list.append(x_new[row][7]) tmp_list.append(x_new[row][8]) tmp_list.append(x_new[row][9]) XList.append(tmp_list) yList.append(data.iloc[row]['y']) F = f_regression(XList, yList) print(len(F)) print(F) 测试结果: 2 (array([2531.07587725, 1166.63303449, 2891.97789543, 2531.07587725, 2786.75491791, 2891.62686404, 3682.42649607, 1394.46743196, 531.08672792, 1166.63303449]), array([0.00000000e+000, 1.74675421e-242, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 1.37584507e-286, 1.15614152e-114, 1.74675421e-242])) 根据以上得到的结果,我选取了rw,st,lw,cf,cam,cm(选取F值相对大的)几个特征加入模型之中。以下是我改进后的代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : soccer_value.py # @Author: Huangqinjian # @Date : 2018/3/22 # @Desc : import pandas as pd import matplotlib.pyplot as plt import xgboost as xgb import numpy as np from xgboost import plot_importance from sklearn.preprocessing import Imputer def loadDataset(filePath): df = pd.read_csv(filepath_or_buffer=filePath) return df def featureSet(data): imputer = Imputer(missing_values='NaN', strategy='mean', axis=0) imputer.fit(data.loc[:, ['rw', 'st', 'lw', 'cf', 'cam', 'cm']]) x_new = imputer.transform(data.loc[:, ['rw', 'st', 'lw', 'cf', 'cam', 'cm']]) data_num = len(data) XList = [] for row in range(0, data_num): tmp_list = [] tmp_list.append(data.iloc[row]['club']) tmp_list.append(data.iloc[row]['league']) tmp_list.append(data.iloc[row]['potential']) tmp_list.append(data.iloc[row]['international_reputation']) tmp_list.append(data.iloc[row]['pac']) tmp_list.append(data.iloc[row]['sho']) tmp_list.append(data.iloc[row]['pas']) tmp_list.append(data.iloc[row]['dri']) tmp_list.append(data.iloc[row]['def']) tmp_list.append(data.iloc[row]['phy']) tmp_list.append(data.iloc[row]['skill_moves']) tmp_list.append(x_new[row][0]) tmp_list.append(x_new[row][1]) tmp_list.append(x_new[row][2]) tmp_list.append(x_new[row][3]) tmp_list.append(x_new[row][4]) tmp_list.append(x_new[row][5]) XList.append(tmp_list) yList = data.y.values return XList, yList def loadTestData(filePath): data = pd.read_csv(filepath_or_buffer=filePath) imputer = Imputer(missing_values='NaN', strategy='mean', axis=0) imputer.fit(data.loc[:, ['rw', 'st', 'lw', 'cf', 'cam', 'cm']]) x_new = imputer.transform(data.loc[:, ['rw', 'st', 'lw', 'cf', 'cam', 'cm']]) data_num = len(data) XList = [] for row in range(0, data_num): tmp_list = [] tmp_list.append(data.iloc[row]['club']) tmp_list.append(data.iloc[row]['league']) tmp_list.append(data.iloc[row]['potential']) tmp_list.append(data.iloc[row]['international_reputation']) tmp_list.append(data.iloc[row]['pac']) tmp_list.append(data.iloc[row]['sho']) tmp_list.append(data.iloc[row]['pas']) tmp_list.append(data.iloc[row]['dri']) tmp_list.append(data.iloc[row]['def']) tmp_list.append(data.iloc[row]['phy']) tmp_list.append(data.iloc[row]['skill_moves']) tmp_list.append(x_new[row][0]) tmp_list.append(x_new[row][1]) tmp_list.append(x_new[row][2]) tmp_list.append(x_new[row][3]) tmp_list.append(x_new[row][4]) tmp_list.append(x_new[row][5]) XList.append(tmp_list) return XList def trainandTest(X_train, y_train, X_test): # XGBoost训练过程 model = xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=False, objective='reg:gamma') model.fit(X_train, y_train) # 对测试集进行预测 ans = model.predict(X_test) ans_len = len(ans) id_list = np.arange(10441, 17441) data_arr = [] for row in range(0, ans_len): data_arr.append([int(id_list[row]), ans[row]]) np_data = np.array(data_arr) # 写入文件 pd_data = pd.DataFrame(np_data, columns=['id', 'y']) # print(pd_data) pd_data.to_csv('submit.csv', index=None) # 显示重要特征 # plot_importance(model) # plt.show() if __name__ == '__main__': trainFilePath = 'dataset/soccer/train.csv' testFilePath = 'dataset/soccer/test.csv' data = loadDataset(trainFilePath) X_train, y_train = featureSet(data) X_test = loadTestData(testFilePath) trainandTest(X_train, y_train, X_test) 再次提交,这次MAE为 42.1227,排名16/28。虽然提升了不少,不过距离第一名还是有差距,仍需努力。 接下来,我们来处理一下下面这个字段: 由于这两个字段是标签,需要进行处理以后(标签标准化)才用到模型中。我们要用到的函数是sklearn.preprocessing.LabelEncoder: le = preprocessing.LabelEncoder() le.fit(['Low', 'Medium', 'High']) att_label = le.transform(data.work_rate_att.values) # print(att_label) def_label = le.transform(data.work_rate_def.values) # print(def_label) 当然你也可以使用pandas直接来处理离散型特征变量,具体内容可以参考:pandas使用get_dummies进行one-hot编码。顺带提一句,scikit中也有一个方法可以来处理,可参考:sklearn.preprocessing.OneHotEncoder。 调整后的代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : soccer_value.py # @Author: Huangqinjian # @Date : 2018/3/22 # @Desc : import pandas as pd import matplotlib.pyplot as plt import xgboost as xgb from sklearn import preprocessing import numpy as np from xgboost import plot_importance from sklearn.preprocessing import Imputer from sklearn.cross_validation import train_test_split def featureSet(data): imputer = Imputer(missing_values='NaN', strategy='mean', axis=0) imputer.fit(data.loc[:, ['rw', 'st', 'lw', 'cf', 'cam', 'cm']]) x_new = imputer.transform(data.loc[:, ['rw', 'st', 'lw', 'cf', 'cam', 'cm']]) le = preprocessing.LabelEncoder() le.fit(['Low', 'Medium', 'High']) att_label = le.transform(data.work_rate_att.values) # print(att_label) def_label = le.transform(data.work_rate_def.values) # print(def_label) data_num = len(data) XList = [] for row in range(0, data_num): tmp_list = [] tmp_list.append(data.iloc[row]['club']) tmp_list.append(data.iloc[row]['league']) tmp_list.append(data.iloc[row]['potential']) tmp_list.append(data.iloc[row]['international_reputation']) tmp_list.append(data.iloc[row]['pac']) tmp_list.append(data.iloc[row]['sho']) tmp_list.append(data.iloc[row]['pas']) tmp_list.append(data.iloc[row]['dri']) tmp_list.append(data.iloc[row]['def']) tmp_list.append(data.iloc[row]['phy']) tmp_list.append(data.iloc[row]['skill_moves']) tmp_list.append(x_new[row][0]) tmp_list.append(x_new[row][1]) tmp_list.append(x_new[row][2]) tmp_list.append(x_new[row][3]) tmp_list.append(x_new[row][4]) tmp_list.append(x_new[row][5]) tmp_list.append(att_label[row]) tmp_list.append(def_label[row]) XList.append(tmp_list) yList = data.y.values return XList, yList def loadTestData(filePath): data = pd.read_csv(filepath_or_buffer=filePath) imputer = Imputer(missing_values='NaN', strategy='mean', axis=0) imputer.fit(data.loc[:, ['rw', 'st', 'lw', 'cf', 'cam', 'cm']]) x_new = imputer.transform(data.loc[:, ['rw', 'st', 'lw', 'cf', 'cam', 'cm']]) le = preprocessing.LabelEncoder() le.fit(['Low', 'Medium', 'High']) att_label = le.transform(data.work_rate_att.values) # print(att_label) def_label = le.transform(data.work_rate_def.values) # print(def_label) data_num = len(data) XList = [] for row in range(0, data_num): tmp_list = [] tmp_list.append(data.iloc[row]['club']) tmp_list.append(data.iloc[row]['league']) tmp_list.append(data.iloc[row]['potential']) tmp_list.append(data.iloc[row]['international_reputation']) tmp_list.append(data.iloc[row]['pac']) tmp_list.append(data.iloc[row]['sho']) tmp_list.append(data.iloc[row]['pas']) tmp_list.append(data.iloc[row]['dri']) tmp_list.append(data.iloc[row]['def']) tmp_list.append(data.iloc[row]['phy']) tmp_list.append(data.iloc[row]['skill_moves']) tmp_list.append(x_new[row][0]) tmp_list.append(x_new[row][1]) tmp_list.append(x_new[row][2]) tmp_list.append(x_new[row][3]) tmp_list.append(x_new[row][4]) tmp_list.append(x_new[row][5]) tmp_list.append(att_label[row]) tmp_list.append(def_label[row]) XList.append(tmp_list) return XList def trainandTest(X_train, y_train, X_test): # XGBoost训练过程 model = xgb.XGBRegressor(max_depth=6, learning_rate=0.05, n_estimators=500, silent=False, objective='reg:gamma') model.fit(X_train, y_train) # 对测试集进行预测 ans = model.predict(X_test) ans_len = len(ans) id_list = np.arange(10441, 17441) data_arr = [] for row in range(0, ans_len): data_arr.append([int(id_list[row]), ans[row]]) np_data = np.array(data_arr) # 写入文件 pd_data = pd.DataFrame(np_data, columns=['id', 'y']) # print(pd_data) pd_data.to_csv('submit.csv', index=None) # 显示重要特征 # plot_importance(model) # plt.show() if __name__ == '__main__': trainFilePath = 'dataset/soccer/train.csv' testFilePath = 'dataset/soccer/test.csv' data = pd.read_csv(trainFilePath) X_train, y_train = featureSet(data) X_test = loadTestData(testFilePath) trainandTest(X_train, y_train, X_test) 这次只提高到了40.8686。暂时想不到提高的方法了,还请大神多多赐教! 更多内容欢迎关注我的个人公众号

优秀的个人博客,低调大师

Jarvis-拍立淘里面的深度学习引擎-之持续优化

介绍 Jarvis是一款专门为手机端而设计研发的深度学习引擎,它比我们目前已知的所有开源产品都要快。在使用高通芯片的安卓手机上,其他产品在性能上甚至还没有接近于我们的。小小骄傲一下。在最开始的时候,Jarvis was heavily influenced by Caffe2 and borrowed quite a bit of code from it. 但是随着时间的推移以及业务的演进,Jarvis离Caffe2也越来越远,所以,我们最终决定发布独立的产品。 Jarvis由淘宝的 拍立淘 业务而生,已持续稳定服役一年。 性能 距离上次介绍Jarvis又过去了三个月的时间,现在的Jarvis相比之前又有了很多进步,在端上承载的拍立淘业务也逐渐增多。不知不觉间,Jarvis已经成为了最快的那一款。之前我们的CPU实现比ncnn要慢,现在

优秀的个人博客,低调大师

拿什么守护你-PHP程序级守护进程的实现与优化

首先需要解释的是什么是守护进程。 守护进程就是在后台一直运行的进程。比如我们启动的httpd,mysqld等进程都是常驻内存内运行的程序。 针对需求进行分析: 需求:有一个常驻队列messageQueue(假设在redis内存中),这个队列会有可能有请求不定期的往队列中增加元素。同时我们要求在队列中有元素的时候,按照队列顺序将元素pop出来,并进行处理(假设这个处理只是echo ‘test’); 解决方法: 现在假设已经有了两个函数 function oPopMessageQueue(){ …} //获取队列最后一个元素; function vDealElement($element) { …} 处理元素; 要求写出一个守护程序,完成上面的需求。 程序: 好了,这个程序很容易想到,可以使用while循环来做 1 2 3 4 5 6 7 while (true) { if ( $element = oPopMessageQueue()) { vDealElement( $element ); } } 考虑1 : 这个程序如果一直跑的话已经可以满足上面的需求了. 但是考虑到:1 用php进程跑有可能会由于各种情况(比如运行时间过长),进程挂了,这样程序就无法自动重连了. 方法:使用cron 我们在定时脚本中每10分钟起一个进程跑这个程序。 然后设置这个程序的运行时间为10分钟,10分钟后自动取消,于是代码变成 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 while (true) { if ( $element = oPopMessageQueue()) { vCheckTimeLimit(); vDealElement( $elemnt ); } } $timeStart = 0; function vCheckTimeLimit() { global $timeStart ; if ( empty ( $timeStart )) { $timeStart = time(); } if (time() - $timeStart > 60*10) { exit ; } } 1 1 考虑2,可能会有这种需求: 需要有随时让脚本暂停的功能: 1 于是考虑使用文件来增加暂停功能 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 while (true) { if ( $element = oPopMessageQueue()) { vCheckTimeLimit(); vCheckEnd(); vDealElement( $elemnt ); } } function vCheckEnd() { if ( file_exists ( "/home/JesephYe/end" )) { exit ; } } 1 考虑3, 是否可以改成多线程的程序,让运行的效率更高? 1 这个只要把cron的10分钟起一个进程的限制改成每1分钟起一个进程就好了 1 这样能保证有10个线程在运行程序 1 但是有一个基本要求是:oPopMessageQueue()是一个原子操作 本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2012/03/04/2378783.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

阿里云 ECS Linux 服务器 SSH 服务的安全配置优化

1、修改 ssh 的连接端口,建议改成非标准的高端端口【1024到65535】。 Port 22022 2、禁止 root 用户直接登录 ssh,用普通账号 ssh 连接,然后在切换到 root 账号登录。 在/etc/ssh/sshd_config配置文件中设置以下参数 PermitRootLogin no 以上两个配置,都需修改 ssh 的配置文件 vim /etc/ssh/sshd_config,修改的内容如下。 修改完配置文件后,需要重启 ssh 服务生效。 /etc/init.d/sshd restart 3、限制 ssh 连接的 IP 地址,只允许用户指定的 IP 地址可以 ssh 连接服务器。 修改 /etc/hosts.allow 和 /etc/hosts.deny 这两个配置文件。 vim /etc/hosts.deny #设置禁止所有ip连接服务器的ssh。 sshd:all:deny vim /etc/hosts.allow #设置允许指定ip连接服务器的ssh。 sshd:210.xx.xx.xx:allow 4、按照以上设置后,ssh 登录服务器,需要用普通账号,指定 ssh 的端口,用指定的 IP 地址才可以登录 ssh。 用普通账号登录ssh后,用su命令切换到root账号即可。 本文转自 2013yang 51CTO博客,原文链接:http://blog.51cto.com/yangeinstein/2043386

优秀的个人博客,低调大师

Android内存优化13 内存泄漏常见情况4 资源未关闭泄漏

资源未关闭或释放导致内存泄露 在使用IO、File流或者Sqlite、Cursor等资源时要及时关闭。这些资源在进行读写操作时通常都使用了缓冲,如果及时不关闭,这些缓冲对象就会一直被占用而得不到释放,以致发生内存泄露。因此我们在不需要使用它们的时候就及时关闭,以便缓冲能及时得到释放,从而避免内存泄露。 1.数据库的cursor没有关闭。 操作Sqlite数据库时,Cursor是数据库表中每一行的集合,Cursor提供了很多方法,可以很方便的读取数据库中的值, 可以根据索引,列名等获取数据库中的值,通过游标的方式可以调用moveToNext()移到下一行 当我们操作完数据库后,一定要记得调用Cursor对象的close()来关闭游标,释放资源。 2,未关闭InputStream/OutputStream。 3,Bitmap对象不在使用时调用recycle()释放内存 4,BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap 本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/8473599.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

SharePoint 2007 Web Content Management 性能优化系列 1 - 做好拓扑架构规划

是的,你可能有些意外,但如果希望你的SharePoint WCM应用有好的性能,第一个要做的,就是在正式开始动手前,好好规划一下整个服务器场的拓扑结构。 SharePoint 2007支持服务器场部署,我们可以将前端Web服务器、应用服务器(包括Index服务器、Query服务器、文档转换服务器、Excel Services服务器等)和数据库服务器分开部署。最小的服务器场规模,可以将所有服务器角色安装到一台物理服务器上,而对于大型应用而言,将各个服务器角色分开部署到单独的物理服务器上,确实可以大大的提高服务器场的响应速度。 微软发布过两个针对SharePoint WCM的解决方案,它们是Visio格式文件,里面包含了解决方案的描述、需要考虑的问题、推荐的实现方式等等。第一个是针对不常更新Web内容的WCM应用,另外一个是针对经常更新Web内容的WCM应用。我建议您在开始之前,好好看看这两个Visio文件。 我个人的推荐部署拓扑方案: (1)、不要将域控器(Domain Controller)与任何SharePoint服务器安装在一起,这是一种既没有必要、也不方便维护的方法。 (2)、尽量将数据库服务器单独安装到一台物理服务器上,给数据库服务器大一点的内存,SQL Server 2005能够充分的享受大内存的好处,由于SharePoint会将所有数据存放到数据库中,所以好的磁盘IO可以很大的提高数据存取速度,同时RAID-1对于SharePoint数据安全也是很有必要的。如果数据量非常大,那么就要考虑使用多台数据库服务器,给一个Web Application配置多个Content Database,将各个Content Database分布到不同的物理服务器上。 (3)、尽量将应用服务器与前端Web服务器分开到单独的物理服务器上。如果SharePoint中有大量的文档和数据,Index服务是很耗费CPU资源的,所以将Index和Query服务器部署到一台单独的物理服务器上是一个不错的选择。 (4)、对于前端Web服务器,仔细考虑一下,是否有必要使用多台前端Web服务器(也就是说,如果有必要,那就添加一个新的前端Web服务器。怎样才算是有必要呢?我的建议是,在实际环境中亲自体验和测试一下站点的访问速度,比如,使用一些网站压力测试工具来模拟多用户并发访问。任何事先的估算都只是“估计”而已。)。由于SharePoint对服务器场部署的良好支持,我们可以随时将一台新的前端Web服务器添加到整个SharePoint服务器场中,而且SharePoint会自动帮我们在这台新的前端Web服务器上配置IIS站点等,极大的简化了管理员的负担。 关于向SharePoint服务器场中添加新的前端Web服务器,请参考http://technet2.microsoft.com/Office/en-us/library/b4279ff9-2842-475a-8d7f-cc90711c47271033.mspx?mfr=true。 总结来说,前端Web服务器:应用服务器:数据库服务器使用1:1:1在很多场合都够用了,如果是2:1:1则更好。 要提醒的是,如果在服务器场中有多台前端Web服务器,SharePoint自己是不会自动做访问请求分发的,我们要么需要使用一个NLB设备要做请求分发(推荐的方式),要么使用Windows Server自带的NLB功能来实现。不过好消息是,由于SharePoint不会在前端Web服务器上保存任何访问状态信息(比如Session),所以NLB非常简单,我们可以把任意请求分发到任意前端Web服务器上(也就是说,当一个用户第一次打开页面时,NLB将他的请求分发到Web服务器A,用户点击了页面上的一个按钮触发页面刷新,NLB可能将他的请求分发到Web服务器B,由于SharePoint应用不依赖Web服务器上保存的状态信息,所以这是没问题的),而不用关注访问绑定问题。这确实是SharePoint在设计上的一个大亮点! 关于服务器的硬件,要知道,硬件是很便宜的,有些时候吝惜好的硬件投入只会带来更多的麻烦。下面的微软推荐的硬件配置: (1)、数据库服务器:双CPU(主频不低于2.5G),4GB RAM(64位系统可以支持更多的内存),SCSI,RAID-1 (2)、应用服务器(Index、Query、Excel Services、Document Conventer):双CPU(主频不低于2.5G),4GB RAM (3)、前端Web服务器:双CPU(主频不低于3G),>2GB RAM 当然了,并不是说你非得要有上面所说的这些硬件,才能开始玩SharePoint。有时候在真实项目中由于设备所限,我们甚至要将所有东东都安装到一台物理服务器上。我的建议是,如果服务器数量很少,那么内存一定不能低于3GB,然后要有一个双核CPU。 本文转自 kaneb0y 51CTO博客,原文链接:http://blog.51cto.com/kaneboy/280832,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册