Linux Swap文件

想象一下,两个实验进程跑了两天,还有一天就跑完了,这个时候你发现如果再跑一会儿内存就要爆了…怎么办? (好惊险的感觉 XD) 好吧,其实用到的只是很基本的操作系统知识,不过还真难得用到一回。 程序面对的都是虚拟内存。64位的操作系统下,虚拟内存非常大,但是实际物理内存相对而言小得多。所以,操作系统对内存分页 (就是分成一块一块的,每一块儿叫做一页) 物理内存一旦满了,把暂时不需要的页写到硬盘里。过了一会儿程序又要访问被写到硬盘里的那部分内容,操作系统就在物理内存中选一个页 (怎么选很讲究的),把硬盘里的那个给换回来。程序不停的运行,操作系统就换来换去… 所以,上面我们遇到的情形就可以解决了。把其中一个进程挂起 (suspend),Linux下可以用 Ctrl+Z ,然后这部分内存就是暂时不用的了。这个时候用 $top 查看内存使用情况,可以看到一个CPU占用率为0的进程占用的内存越来越少,另一个越来越多。这样就行了,等一个进程跑完,再用 $fg 命令把挂起的进程调到前台就可以了。 但是等等。虚拟内存具体是在哪里呢?数据终究是写在内存/硬盘上的,Linux下被换到硬盘上的内存在Swap分区 (交换分区) 里。安装系统的时候需要格式化一个分区为Swap格式,就是这个分区。 用 $swapon -s 可以查看交换分区的大小。 糟糕!刚才那个被挂起的进程占用了24G的内存,但是现在看到我的交换分区只用12G,怎么办?一旦交换分区和内存都满了,会发生神马事情,我也没有体验过,估计应该是系统卡死或者卡而不死吧。 所以,应该赶紧增加交换分区的大小才是。可是如果你和我一样,很悲催的没有Root权限 (Root权限貌似是必须的…),而且也根本没有多余的分区可以挂载了,怎么办? 可以用Swap文件 (点题) ! 就是把一个文件用做swap分区,Linux下什么都是文件,分区应该也是吧。要增加系统可用的虚拟内存,当然这要求你硬盘剩余空间够大… $dd if=/dev/zero of=~/swapfile bs=1024 count=41943040 会在HOME下创建一个40G的文件”~/swapfile”,命令要执行一会儿,需要写一段时间硬盘,执行完了会显示写硬盘的速度,可以用来做测速的。 然后告诉系统用这个文件做交换文件 mkswap ~/swapfile 就没问题了。 (实际上不行,还需要这个命令, –!) sudo swapon ~/swapfile 其实最一开始那个情形下,如果两个进程继续跑下去,操作系统仍然会把一部分内容换出来的。只是大量换页操作会让程序执行的时间更长,而且如果交换空间不够大,系统最终仍然可能会被卡死。 感叹一下,一个实验要跑三天的同学伤不起啊..

利用摄像头判断手机移动方向[MPMotionPattern]

这部分代码是做原型用的,现在已经不在项目里。 也没有什么特别的算法,所以就放在这里吧。 https://github.com/pppoe/MPMotionPattern 需要用到之前的“iOS逐帧处理录像-MPVideoProcessor”。 主要的算法是从TinyMotion这个项目来的,用到的也是他们的算法。 功能很简单,就是通过iPhone摄像头拍摄的图像,判断手机当前的移动方向。 现在也只是支持上下左右。因为iPhone本身就有传感器可以取到这种动作,所以用图像似乎也没有什么特别的优势… 只是感觉挺好玩的。XD

libstdc++ 4.6 type_traits 的一个bug

如果你的编译环境和我一样,然后又在用C++11的时候,不小心直接或者间接用到了<chrono>这个头文件,应该就会遇到这个bug。 完整的错误信息如下: || In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/thread:37: /usr/include/c++/4.6/chrono|240 col 10| error: cannot cast from lvalue of type ‘const long’ to rvalue reference type ‘rep’ (aka ‘long &&’); types are not compatible || : __r(static_cast(__rep)) { } || ^~~~~~~~~~~~~~~~~~~~~~~ /usr/include/c++/4.6/chrono|128 col 13| note: in instantiation of function template specialization ‘std::chrono::duration >::duration’ requested here || return […]

iOS逐帧处理录像-MPVideoProcessor

一般在iOS上做录像都可以直接使用UIImagePickerController。 但有时候难免需要做逐帧的处理,比如实时的滤镜之类的。 参照这个帖子: A (quasi-) real-time video processing on iOS 把使用AVFoundation做录像的代码,做了一个简单的封装。 Delegate可以得到逐帧的彩色或者灰度图,然后就可以加上自己需要的处理了。 代码放在Gihub上:MPVideoProcessor 具体使用请参见Github上的Readme.

git submodules

刚刚知道的一个用法,记录一下。 git可以把另一个git工程作为子项目(submodule),如果项目很大的话可以把一些子项目独立出来,单独作为一些个git项目,最后再作为库提供给主工程使用。遵照这个做法正好也能培养个好习惯。 几个命令: $git submodule add git://github.com/chneukirchen/rack.git rack submodules由.gitmodules文件管理。内容如此: [submodule “rack”] path = rack url = git://github.com/chneukirchen/rack.git 如果你clone了一个有submodules的git工程,需要额外的操作来clone其中的submodules. $ git submodule init $ git submodule update 知道这么几个命令就可以试试了。 参考自:6.6 Git Tools – Submodules

CVPR 2012 酱油记

没有文章,老板还是很nice的给了一次去参加CVPR的机会。虽然只是去酱油一把,但是可以到CV三会之一的CVPR看看,还是很高兴的。 提前一天到了罗德岛,这里貌似是美国最小的一个州。风景不错,但是也不觉得有什么很特别的地方。按照会议进程,头两天是Workshop和Tutorial。Tutorial是集中时间讲一个话题,比如这次有Deep Learning, Gaussian Process这种,这里列出了所有的Tutorial,有很多很吸引人的题目。Workshop是做一个小领域的人们讨论这个方向的文章。一趟下来感觉,除了很偏工程的Tutorial,没有事先看看相关的东西就去听还是比较吃力的。相对来说,Workshop比较容易懂。主要是因为Workshop里的文章多,总有一篇适合你… 两天的Workshop和Tutorial覆盖了各个方向,虽然还没有开始主会,已经感觉是码农进了大观园。感叹各种听不懂… 这两天比较有印象的是Perceptual Organization和Biometric Workshop的几篇文章和Vision Industry & Entrepreneur Workshop的两场演讲,Boaz Super列了很多最近的利用CV技术创业的公司,然后用一大堆数据告诉大家,CV是很有前途地。虽然也听了两次Deep Learning相关的Tutorial,唯一有印象的就是Kai Yu的Sparse Coding那场,他的SC相关的文章回头还得找出来看看。 三天主会还是比较紧的。主会时间是早上8点半开始第一场Posters,一天两场Oral,三场Posters,如果Poster很相关的话,基本上一整天都在那些海报前面走来走去。 我感兴趣的Image Classification相关的文章主要是在第二天和第三天。收获确实不小,看到了很多不熟悉的名词,还有些之前没想到的东西。不过也可能是因为自己比较土鳖,看啥都新鲜…可以和作者讨论是比较理想的状态,而且也很有意思,只是文章读得还是少了,能去讨论的情况不多。今年有好几篇讨论Fine-Grained Classification的文章,做这个的可能会越来越多吧。还有就是知道了Transfer Learning这个方向,和Classification也很相关的。训练样本和测试样本不是同一个环境下得到的,这个本身就是比较实际的问题。Object Recognition这块,还是很多文章在讨论BoW之上的改进,有几篇都是在讨论如何加入空间信息,不知道什么时候会有完全不一样的一套模型出来。然后比较有印象的就是各种Simultaneously,比如把分割,分类,标注等等在一个框架下一块儿做完。Oral里面对于Transfer Learning的两篇印象较深,有一篇是Boqing师兄的,讲得很清楚。 这几天,除了看各种文章,就是看到了各位大牛小牛,认识了一些朋友,不过因为没有文章,也不是很容易讨论起来…还有就是遇到了很多科大的师兄,还有同一级的同学,我科的各位一如既往的给力而且Nice,相当高兴。 有一天吃晚饭的时候因为没有找到地方,和三个外国朋友一桌。有一位是开公司的,不住的抱怨现在CVPR里能用的东西太少,算法太慢。想来也是,现在在做的分类算法就根本不能放在机器人上去用。不过技术总是厚积薄发的,总是很多人做了很久,然后忽然一个突破。虽然取得突破的方法可能看起来全新,之前做的那么多东西都没用上,但是前面的积累想来也是必要的吧。XD 2012.6.20 在回程的大巴上