RAM驱动器编译 – 有这样的事情吗?
在Stack Overflow上的一个问题的答案 (见下文)给了我一个伟大的小软件的想法,这对任何地方的编码人员都是无价的。
我想象的是RAM驱动软件,但有一个关键的区别 – 它会镜像在我的硬盘驱动器上的真实文件夹。 更具体地说 – 包含我目前正在处理的项目的文件夹。 这样,任何构build几乎是瞬间的(或者至less快几个数量级)。 RAM驱动器将仅使用空闲资源在后台将其内容与硬盘驱动器同步。
一个快速的谷歌search没有透露,但也许我不知道如何谷歌。 也许有人知道这样的软件? 最好免费,但合理的费用也可以。
补充:一些解决scheme已经提出,我刚开始丢弃了。 他们会(没有特定的顺序):
- 购买更快的硬盘驱动器( SSD可能或10K RPM)。 我不想要硬件解决scheme。 不仅软件有可能会更便宜(免费软件,任何人),但它也可以用于硬件修改是不受欢迎的环境,如果不是不可能 – 比如在办公室。
- 让OS / HDD做caching – 它更好地知道如何使用你的空闲RAM。 操作系统/硬盘有通用的cachingalgorithmcaching一切,并试图预测哪些数据将来最需要的。 他们不知道,我的优先项目是我的项目文件夹。 而且大家都很清楚,反正他们并没有真正caching起来。 ;)
- 有大量的RAM驱动器; 使用其中之一。 对不起,这是鲁莽的。 每当有空闲时间时,我需要将数据同步回HDD。 在停电的情况下,我可以承受失去最后五分钟的工作,但不是自从我上次登记以来的一切。
新增2:想出了一个想法 – 使用一个普通的RAM驱动器加上一个后台文件夹同步器(但我的意思是背景 )。 有没有这样的事情?
补充3:有趣。 我只是在工作中尝试了一个简单的RAM驱动器。 重build时间从大约14秒降到大约7秒(不错),但增量构build仍然在5秒左右 – 就像硬盘一样。 任何想法为什么? 它使用aspnet_compiler
和aspnet_merge
。 也许他们在其他地方使用其他临时文件?
补充4:哦,不错的新的答案! :)好的,我为你们所有的反对者提供了一些信息。 🙂
这个想法的主要原因之一,不是上述软件(14秒build造时间),而是另一个,我当时没有访问。 这个其他应用程序有一个100 MB的代码库,其完整版本需要大约5分钟。 是的,这是在Delphi 5 ,所以编译器不是太高级。 :)将源放在RAM驱动器上会导致很大的差异。 我想,我在一分钟之内就明白了。 我没有测量。 所以对于所有那些说操作系统可以更好地caching东西的人来说,我会乞求不同的。
相关问题:
RAM磁盘用于加速IDE
第一个链接的注意事项:它所链接的问题已被删除,因为它是重复的。 它问道:
你的代码在编译时做了什么?
我连接的Dmitri Nesteruk的答案是:
我几乎立即编译。 部分原因是我的项目很小,部分原因是由于使用了RAM磁盘。
在Linux中(你从来没有提到过哪个操作系统,所以这可能是相关的),你可以从RAM创build块设备,并像任何其他块设备(即一个硬盘)一样安装它们。
然后,您可以创build脚本,以便在启动/closures时以及定期复制该驱动器。
例如,你可以设置它,所以你有~/code
和~/code-real
。 你的RAM块在启动时被加载到~/code
中,然后~/code-real
(在你的标准硬盘上)的所有内容都被拷贝过来。 在关机时,一切都会被复制( rsync'd会更快),从~/code
到~/code-real
。 你也可能希望这个脚本定期运行,所以在停电等情况下你不会失去很多工作。
我不再这样做了(当9.5testing版慢时,我不再使用它)。
这里是如何在Linux中创build一个RAM磁盘。
我感到惊讶的是,有多less人认为操作系统能够比你在这个专门的案例中更好的解决你的caching需求。 虽然我没有这样做的编译,我做了类似的过程,我最终使用RAM磁盘与脚本,自动化的同步。
在这种情况下,我想我会用现代的源代码控制系统。 在每次编译时,都会自动检查源代码(如果需要的话,沿着实验分支),以便每次编译都会导致数据被保存。
要开始开发,请启动RAM磁盘并拉出当前的基线。 做编辑,编译,编辑,编译等等 – 所有的这些编辑都是为你保存的。
当开心的时候做最后的检查,而且你甚至不需要使用普通的硬盘。
但是有些后台同步器会自动执行,问题在于它们不会针对编程进行优化,并且可能需要偶尔执行完整的目录和文件扫描以捕获更改。 一个源代码控制系统就是为这个目的而devise的,所以即使它存在于你的编译设置中,它的开销也可能较低。
请记住,在停电的情况下,后台同步任务是不确定的。 如果事情出错了,你最终不得不弄清楚什么是保存的,什么是不保存的。 有了一个定义的保存点(在每次编译时,或者手工强制),你都会有一个非常好的主意,至less在你认为可以编译它的状态下。 使用VCS ,您可以轻松将其与以前的代码进行比较,查看您已经应用了哪些更改。
请参阅加速与tmpfs ( Gentoo Linux维基)出现。
在Gentoo下使用RAM驱动器加速编译是很多年前编写的一个方法的主题。 它提供了一个已经完成的具体事例。 要点是所有源代码和构build中间文件都被redirect到一个RAM磁盘进行编译,而最终的二进制文件则被定向到硬盘上进行安装。
此外,我build议您探索在硬盘上维护您的源代码,但是git push
您最新的源代码更改git push
送到驻留在RAM磁盘上的克隆资源库。 编译克隆。 使用您最喜欢的脚本来复制创build的二进制文件。
我希望有帮助。
当你的操作系统工作的时候,你的操作系统会把它caching在内存中 RAM磁盘可能看起来更快,但这是因为您不考虑“复制到RAMDisk”和“从RAMDisk复制”时间。 将RAM专用于固定大小的ramdisk只会减less可用于高速caching的内存。 操作系统知道什么需要在RAM中。
我没有确切的内容,但是我现在正在使用Ramdisk和DRAM ramdisk的组合。 由于这是Windows,所以对于内核内存我有一个硬性的3 GB的限制,这意味着我不能为RAM磁盘使用太多的内存。 9010上额外增加了4 GB的内存,真是让人震惊。 我让我的IDE将所有临时的东西存储在固态RAM磁盘和Maven仓库中。 DRAM RAM磁盘有一个电池备份到闪存卡。 这听起来像一个广告,但它确实是一个很好的设置。
DRAM磁盘具有双SATA-300端口,并在大多数testing中平均寻找0.0 ms;)圣诞节放养的东西?
使用https://wiki.archlinux.org/index.php/Ramdisk制作RAM磁盘。;
然后我写了这些脚本来移动目录到RAM磁盘。 在移入RAM磁盘之前,在tar文件中进行备份。 这样做的好处是path保持不变,所以你的configuration文件不需要改变。 完成后,使用uramdir
将其恢复到磁盘。
编辑:添加C代码,将运行它在后台间隔给出的任何命令。 我发送它的tar
– 更新更新存档,如果有任何更改。
我相信这个通用的解决scheme可以打败一个非常简单的解决scheme。 吻
确保你改变path到rdbackupd
ramdir
#!/bin/bash # May need some error checking for bad input. # Convert relative path to absolute # /bin/pwd gets real path without symbolic link on my system and pwd # keeps symbolic link. You may need to change it to suit your needs. somedir=`cd $1; /bin/pwd`; somedirparent=`dirname $somedir` # Backup directory /bin/tar cf $somedir.tar $somedir # Copy, tried move like https://wiki.archlinux.org/index.php/Ramdisk # suggests, but I got an error. mkdir -p /mnt/ramdisk$somedir /bin/cp -r $somedir /mnt/ramdisk$somedirparent # Remove directory /bin/rm -r $somedir # Create symbolic link. It needs to be in parent of given folder. /bin/ln -s /mnt/ramdisk$somedir $somedirparent #Run updater ~/bin/rdbackupd "/bin/tar -uf $somedir.tar $somedir" &
uramdir
#!/bin/bash #Convert relative path to absolute #somepath would probably make more sense # pwd and not /bin/pwd so we get a symbolic path. somedir=`cd $1; pwd`; # Remove symbolic link rm $somedir # Copy dir back /bin/cp -r /mnt/ramdisk$somedir $somedir # Remove from ramdisk /bin/rm -r /mnt/ramdisk$somedir # Stop killall rdbackupd
rdbackupd.cpp
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <signal.h> #include <sys/time.h> struct itimerval it; char* command; void update_archive(int sig) { system(command); } int main(int argc, char**argv) { it.it_value.tv_sec = 1; // Start right now it.it_value.tv_usec = 0; it.it_interval.tv_sec = 60; // Run every 60 seconds it.it_interval.tv_usec = 0; if (argc < 2) { printf("rdbackupd: Need command to run\n"); return 1; } command = argv[1]; signal(SIGALRM, update_archive); setitimer(ITIMER_REAL, &it, NULL); // Start while(true); return 0; }
我们在几年前曾经为4GLmacros编译器做过; 如果将macros库,支持库和代码放在RAM磁盘上,编译应用程序(在80286上)将从20分钟到30秒。
-
简介。 确保你做好每个选项的测量。 你甚至可以购买你已经拒绝的东西,衡量它们,然后把它们退回来,这样你就知道你正在用好的数据工作。
-
获得大量的RAM。 2 GB DIMM非常便宜; 4 GB DIMM的价格略高于US $ 100 / ea,但与几年前的电脑部件相比,这还不算很多。 不pipe你是用RAM磁盘还是让操作系统去做,这都会有帮助。 如果您运行的是32位Windows,则需要切换到64位才能使用超过3 GB的内容。
-
Live Mesh可以从本地RAM驱动器同步到云或另一台计算机,为您提供最新的备份。
-
只移动编译器输出。 将源代码保存在真实的物理磁盘上,但直接在RAM驱动器上创build.obj,.dll和.exe文件。
-
考虑一个DVCS 。 从实际驱动器克隆到RAM驱动器上的新存储库。 每次将所有的testing通过时,都要经常“推”你的修改回到父母身上。
是的,我遇到了同样的问题。 并没有结果的谷歌search后,我只是写了一个Windows服务懒的备份RAM驱动器(实际上 – 任何文件夹,因为RAM驱动器可以挂载到,例如,桌面)。
http://bitbucket.org/xkip/transparentbackup您可以指定完整扫描的时间间隔(默认5分钟)。; 并且只扫描通知文件的时间间隔(默认30秒)。 扫描使用“归档”属性检测已更改的文件(操作系统重置专门用于归档目的的文件)。 只有以这种方式修改的文件才被备份。
该服务留下一个特殊的标记文件,以确保目标备份完全是源的备份。 如果源为空且不包含标记文件,则该服务将执行从备份中自动还原。 因此,您可以轻松销毁RAM驱动器,并使用自动数据恢复function重新创build它。 最好使用能够在系统启动时创build分区的RAM驱动器,以使其透明工作。
我最近检测到的另一个解决scheme是SuperSpeed SuperCache 。
该公司也有一个RAM磁盘,但这是另一个软件。 SuperCache允许您使用额外的RAM来进行块级caching(这与caching文件非常不同),另一种select是将镜像驱动到RAM中。 在任何情况下,您都可以指定将脏块放回到硬盘驱动器的频率,使得在RAM驱动器上进行写入操作,但是镜像scheme也会像RAM驱动器那样进行读取操作。 您可以创build一个小的分区,例如2 GB(使用Windows),并将整个分区映射到RAM。
关于该解决scheme的一个有趣和非常有用的事情 – 您可以随时更改caching和镜像选项,只需点击两下即可。 例如,如果您希望将2 GB备份到gamimg或虚拟机,则可以立即停止镜像并释放内存。 即使打开的文件句柄也不会中断 – 分区继续工作,但是作为通常的驱动器。
编辑:我也强烈build议你将TEMP文件夹移动到RAM驱动器,因为编译器通常会与临时工做大量的工作。 就我而言,它给了我另外30%的编译速度。
我不知道你是否可以build立一个像软件RAID 1那样的物理磁盘/分区作为成员,以及作为成员的一大块RAM。
我敢打赌,稍微调整一下,一些奇怪的configuration可以让Linux做到这一点。 我不相信,这是值得的努力。
有很多RAMDrives,使用其中之一。 对不起,这是鲁莽的。
只有当你完全在RAM光盘上工作,这是愚蠢的..
伪贝壳脚本,ramMake:
# setup locations $ramdrive = /Volumes/ramspace $project = $HOME/code/someproject # ..create ram drive.. # sync project directory to RAM drive rsync -av $project $ramdrive # build cd $ramdrive make #optional, copy the built data to the project directory: rsync $ramdrive/build $project/build
这就是说,你的编译器可以做到这一点,没有额外的脚本..只是改变你的生成输出位置到一个RAM光盘,例如在Xcode,它是在首选项,build立“放置生成产品:”和“放置中间生成文件在:”。
即使是单核机器,甚至是超级好处也是平行的。 磁盘I / O在构build过程中是一个相当大的因素。 在每个CPU内核中产生两个编译器实例实际上可以提高性能。 由于一个编译器实例在I / O上阻塞,另一个编译器实例通常会跳入编译的CPU密集部分。
你需要确保你有内存来支持这个(在现代化的工作站上不应该是一个问题),否则你会最终交换,并且失败的目的。
在GNU上,你可以使用-j[n]
,其中[n]
是产生同时进程的数量。 在尝试之前确保你有依赖关系树,否则结果可能是不可预测的。
另一个真正有用的工具是distcc 。 它适用于GCC(如果你可以使用GCC或类似的命令行界面)。 distcc通过伪装成远程服务器上的编译器和产卵任务来实际上分散了编译任务。 您可以像调用GCC一样调用它,并利用make的-j [n]选项调用许多distcc进程。
在我以前的工作之一,我们有一个相当密集的Linux操作系统构build,几乎每天都进行一段时间。 添加一对专用的构build机器,并将distcc放在几个工作站上以接受编译作业,这使我们能够将构build时间从半天缩短到60分钟以下,以实现完整的OS +用户空间构build。
还有很多其他工具可以加快编译的速度。 您可能想要调查超过创buildRAM磁盘; 因为操作系统正在使用RAM进行磁盘caching,所以看起来似乎没什么收获。 操作系统devise人员花费大量时间为大多数工作负载正确caching; 他们(总的来说)比你聪明,所以我不想尝试和比他们做得更好。
如果你咀嚼RAM的RAM磁盘,操作系统有更less的工作RAMcaching数据,并运行你的代码 – >你会最终交换和更糟糕的磁盘性能比其他(注意:你应该configuration文件这个选项之前,完全丢弃它)。
我有同样的想法,做了一些研究。 我发现以下工具可以做你正在寻找的东西:
- VSuite RAM磁盘
- DiskBoost
然而,第二个我根本无法在64位Windows 7上工作,而且目前似乎没有得到维护。
另一方面VSuite RAM磁盘工作得很好。 不幸的是我不能衡量任何显着的性能提升相比, 固态硬盘 。
这听起来像你的操作系统和/或你的硬盘驱动器自动处理的磁盘caching(不同程度的性能,诚然)。
我的build议是,如果你不喜欢你的驱动器的速度,纯粹为了编译目的而购买一个高速驱动器。 减less你的劳动力,你可能有解决你的编译困境。
由于这个问题最初被问到,与SSD相比,旋转硬盘变成了悲惨的乌龟。 它们非常接近原始请求的SKU中的RAM磁盘,您可以从Newegg或Amazon购买。
我的头顶有些想法:
使用Sysinternals的进程监视器 (不是进程资源pipe理器 )来检查在编译过程中发生了什么 – 例如,这可以让你看到是否使用了%temp%
(请记住,响应文件可能是用FILE_ATTRIBUTE_TEMPORARY创build的,它应该防止磁盘写入如果可能的话)。 我已经将我的%TEMP%
移动到了RAM磁盘上,这使我可以在一般情况下获得较小的加速。
获取支持自动加载/保存磁盘映像的RAM磁盘,因此您不必使用启动脚本来执行此操作。 顺序读取/写入单个磁盘映像比同步大量小文件要快。
将常用/大型头文件放在RAM磁盘上,并覆盖编译器的标准path以使用RAM驱动器副本。 不过,在首次构build之后,这个改进可能不会有太大的改进,但是,由于操作系统caching了标准头文件。
将您的源文件保存在硬盘上,并同步到RAM磁盘 – 而不是相反 。 检查MirrorFolder做文件夹之间的实时同步 – 它通过filter驱动程序实现这一点,所以只有同步必要(只做更改 – 一个4 KB写入2 GB文件只会导致4 KB写入目标文件夹)。 弄清楚如何使你的IDE从RAM驱动器生成,尽pipe源文件在你的硬盘上…并记住,你将需要一个大的 RAM驱动器的大型项目。
您发生的磁盘放缓主要是写入,也可能是由于病毒扫描程序。 它们在不同的操作系统之间也会有很大的差
随着写入速度最慢的想法,我会试图build立一个中间(例如, .o
文件)和二进制文件获取输出到不同的位置,如RAM驱动器。
然后,您可以将此bin / intermediate文件夹链接到更快的媒体(使用符号链接或NTFS联结点 )。
我对这个问题的最终解决scheme是vmtouch: https ://hoytech.com/vmtouch/这个工具将当前文件夹locking到(ram)caching中,并将vmtouch守护进程locking到后台。
sudo vmtouch -d -L ./
把它放在shell rc中以便快速访问:
alias cacheThis = 'sudo vmtouch -d -L ./'
我search了一个很好的脚本,因为我不想浪费大量时间编写我自己的ramdisk-rsync-script。 我相信我会错过一些边缘案例,如果涉及重要的代码,这将是相当不愉快的。 我从不喜欢投票的方式。
Vmtouch似乎是完美的解决scheme。 另外它不会像固定大小的ramdisk那样浪费内存。 我没有做基准testing,因为我的1Gig源代码+ build文件夹的90%已经被caching了,但是至less感觉更快了;)
正如James Curran所说,大多数程序遵循引用的局部性规律,频繁的代码和数据页数将随着时间的推移被OS磁盘高速caching缩小到可pipe理的大小。
RAM磁盘是有用的,当操作系统是有限制,如愚蠢的caching(赢3.x,赢95,DOS)。 RAM磁盘的优势几乎为零,如果分配了大量内存,它将吸收系统高速cachingpipe理器可用的内存,从而影响整体系统性能。 经验法则是:让你的内核来做到这一点。 这与“内存碎片整理”或“优化器”程序相同:它们实际上是将页面从caching中取出(所以最终会获得更多的内存),但是随着时间的推移,系统会执行大量的页面错误开始询问被传出的代码/数据。
因此,为了获得更高的性能,可以获得一个快速的磁盘I / O硬件子系统,也许RAID,更快的CPU,更好的芯片组(没有VIA!),更多的物理RAM等等。