unidade de RAM para compilar - existe uma coisa dessas?

votos
49

Uma resposta (veja abaixo) para uma das perguntas aqui mesmo no Stack Overflow me deu uma idéia para um grande pedaço de software que pode ser inestimável para programadores em todos os lugares.

Eu estou imaginando software unidade de RAM, mas com uma diferença crucial - que iria espelhar uma pasta real no meu disco rígido. Mais especificamente - a pasta que contém o projeto que estou trabalhando no momento. Desta forma, qualquer constrói seria quase instantânea (ou pelo menos algumas ordens de magnitude mais rápido). A unidade de RAM iria sincronizar seu conteúdo com a unidade de disco rígido no fundo usando apenas recursos ociosos.

Uma rápida pesquisa no Google não revelou nada, mas talvez eu só não sei como Google. Talvez alguém sabe de um tal software? De preferência taxas livres, mas razoáveis ​​pode ser OK também.

Adicionado: Algumas soluções foram sugeridas que eu descartado no início. Eles seriam (em nenhuma ordem particular):

  • Comprar uma unidade de disco rígido mais rápido ( SSD talvez ou 10K RPM). Eu não quero uma solução de hardware. Não só o software tem o potencial de ser mais barato, mas também pode ser usado em ambientes onde as modificações de hardware seria indesejável se não impossível (freeware, alguém?) - por exemplo, no escritório.
  • Vamos OS / HDD fazer o cache - que sabe melhor como usar a sua memória RAM livre. O OS / HDD tem algoritmos de cache genéricos que cache tudo e tentar prever quais os dados serão mais necessários no futuro. Eles não têm idéia de que para mim a prioridade é a minha pasta de projeto. E como todos sabemos muito bem - eles realmente não cache-lo muito de qualquer maneira. ;)
  • Há uma abundância de unidades de RAM ao redor; usar um desses. Desculpe, isso seria imprudente. Eu preciso dos meus dados a serem sincronizados de volta para o disco rígido sempre que há um pouco de tempo livre. No caso de uma falha de energia que eu poderia suportar perder os últimos cinco minutos de trabalho, mas nem tudo desde a minha última check-in.

Adicionado 2: Uma ideia que surgiu - usar uma unidade RAM normal mais um sincronizador de pasta de fundo (mas eu me refiro fundo ). Existe alguma coisa assim?

Adicionado 3: Interessante. Eu só experimentou uma unidade de RAM simples no trabalho. O tempo de reconstrução cai de ~ 14 segundos a ~ 7 segundos (não é ruim), mas compilação incremental ainda está em ~ 5 segundos - assim como no HDD. Alguma idéia por que? Ele usa aspnet_compilere aspnet_merge. Talvez eles fazem algo com outros arquivos temporários em outros lugares?

Adicionado 4: Oh, agradável novo conjunto de respostas! :) OK, eu tenho um pouco mais informação para todos os opositores. :)

Uma das principais razões para esta ideia não é o software acima mencionado (14 secs tempo de construção), mas um outro que eu não tinha acesso no momento. Esta outra aplicação tem uma base de código 100 MB, e sua compilação completa leva cerca de 5 minutos. Ah sim, é em Delphi 5 , então o compilador não é muito avançado. :) Colocar a fonte em uma unidade RAM resultou em uma grande diferença. Eu tenho que abaixo de um minuto, eu acho. Eu não tenho medido. Então, para todos aqueles que dizem que o sistema operacional pode armazenar em cache coisas melhor - eu discordo.

Pergunta relacionada:

disco RAM para acelerar IDE

Nota sobre a primeira ligação: A questão dos links foi excluída porque era uma duplicata. Ele perguntou:

O que você faz durante a compilação do seu código?

E a resposta por Dmitri Nesteruk a que me ligado foi:

Eu compilar quase instantaneamente. Em parte devido aos meus projetos de pequena, em parte devido ao uso de discos de RAM.

Publicado 09/12/2008 em 22:11
fonte usuário
Em outras línguas...                            


18 respostas

votos
17

No Linux (você nunca mencionou qual sistema operacional que você estiver, de modo que este poderia ser relevante) você pode criar dispositivos de blocos de memória RAM e montá-los como qualquer outro dispositivo de bloco (ou seja, um HDD).

Você pode criar scripts que copiar para e a partir dessa unidade no start-up / shutdown, bem como periodicamente.

Por exemplo, você pode configurá-lo para que você teve ~/codee ~/code-real. Seu bloco de RAM é montado no ~/codeno arranque, e depois de tudo, desde ~/code-real(que está no seu disco rígido padrão) é copiado sobre. No desligamento tudo iria ser copiado ( rsync d' seria mais rápido) de volta a partir ~/codede ~/code-real. Você provavelmente também quer que o script para serem executados periodicamente, para que você não perder muito trabalho em caso de falha de energia, etc.

Eu não faço mais isso (eu usei-o para Opera quando o 9.5 beta era lento, não há necessidade anymore).

Aqui é como criar um disco de RAM em Linux.

Respondeu 09/12/2008 em 23:58
fonte usuário

votos
15

Estou surpreso com quantas pessoas sugerem que o sistema operacional pode fazer um trabalho melhor em descobrir suas necessidades de armazenamento em cache do que você pode, neste caso especializada. Enquanto eu não fazer isso para compilar, eu fiz isso por processos semelhantes e acabei usando um disco RAM com scripts que automatizados a sincronização.

Neste caso, eu acho que eu iria com um sistema de controle de origem moderna. Em cada compilá-lo iria verificar no código fonte (ao longo de um ramo experimental se necessário) automaticamente de modo que cada compilação resultaria nos dados a serem salvos off.

Para iniciar o desenvolvimento, iniciar o disco RAM e puxe a linha de base atual. Fazer a edição, compilar, editar, compilar, etc. - tudo enquanto as edições estão sendo gravados.

Fazer a verificação final em quando feliz, e você não tem sequer a envolver a sua unidade de disco rígido regular.

Mas há sincronizadores de fundo que irá automatizar as coisas - o problema é que eles não vão ser otimizado para programação, quer e pode precisar de fazer diretório e arquivo análises completas ocasionalmente para pegar mudanças. Um sistema de controle de código fonte é projetado exatamente para este fim, por isso provavelmente seria menor sobrecarga ainda que existe na sua configuração construção.

Tenha em mente que uma tarefa em segundo plano sincronização, no caso de falta de energia, é indefinido. Você iria acabar por ter de descobrir o que estava guardado eo que não foi salvo se as coisas dessem errado. Com um definido Save Point (em cada compilação, ou forçados à mão) você teria uma idéia muito boa que era, pelo menos em um estado onde você pensou que poderia compilá-lo. Usar um VCS e você pode facilmente compará-lo com o código anterior e ver o que muda você já aplicada.

Respondeu 27/03/2009 em 05:03
fonte usuário

votos
4

Veja Acelerar emergir com tmpfs ( Gentoo Linux wiki).

Acelerar compila usando unidades de RAM sob Gentoo foi objecto de um how-to escrito muitas eras atrás. Ele fornece um exemplo concreto do que foi feito. A essência é que todas as fontes e construir arquivo intermediário são redirecionados para um disco RAM para compilação, enquanto binários finais são direcionados para o disco rígido para instalar.

Além disso, eu recomendo explorar mantendo sua fonte no disco rígido, mas git pushas alterações mais recentes de origem para um repositório clone que reside no disco RAM. Compilar o clone. Use o seu roteiro favorito para copiar os binários criados.

Espero que ajude.

Respondeu 10/12/2008 em 01:28
fonte usuário

votos
3

Use https://wiki.archlinux.org/index.php/Ramdisk para fazer o disco RAM.

Então eu escrevi esses scripts para mover diretórios de e para o disco RAM. Backup é feito em um tar arquivo antes de passar para o disco RAM. A vantagem de fazê-lo desta maneira é que o caminho permanece o mesmo, para que todos os seus arquivos de configuração não precisa mudar. Quando estiver pronto, use uramdirpara trazer de volta para o disco.

Edit: Adicionado código C que irá executar qualquer comando é dado em um intervalo no fundo. Estou enviando-o tarcom --updateatualizar o arquivo, se qualquer alteração.

Eu acredito que esta solução de propósito geral bate tornando uma solução única para algo muito simples. BEIJO

Certifique-se de alterar o caminho para 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;
}
Respondeu 26/10/2011 em 00:00
fonte usuário

votos
3

Eu não tenho exatamente o que você está procurando, mas agora estou usando uma combinação de Ramdisk e DRAM ramdisk . Uma vez que este é o Windows, eu tenho um duro limite de 3 GB de memória de núcleo, o que significa que não posso usar muita memória para um disco RAM. 4 GB extra no 9010 realmente rochas-lo. Eu deixei minha loja IDE todo seu material temporária no disco RAM de estado sólido e também o Maven repositório. O disco DRAM RAM tem uma bateria para o cartão de memória flash. Isso soa como uma propaganda, mas é realmente uma excelente configuração.

O disco DRAM tem o dobro portas SATA-300 e sai com 0,0 ms médio de busca na maioria dos testes;) Algo para o meia do Natal?

Respondeu 09/12/2008 em 22:41
fonte usuário

votos
3

Seu sistema operacional irá armazenar em cache as coisas na memória como ele funciona. Um disco RAM pode parecer mais rápido, mas isso é porque você não está factoring no "cópia para RAMDisk" e "cópia de RAMDisk" vezes. Dedicando RAM para um disco em memória de tamanho fixo apenas reduz a memória disponível para o cache. O OS sabe melhor o que precisa estar na RAM.

Respondeu 09/12/2008 em 22:38
fonte usuário

votos
2

Sim, eu conheci o mesmo problema. E depois googling infrutífera eu só escrevi um serviço do Windows para apoio preguiçoso até a unidade RAM (na verdade - qualquer pasta, porque a unidade RAM pode ser montado em, por exemplo, a área de trabalho).

http://bitbucket.org/xkip/transparentbackup Você pode especificar o intervalo para varredura completa (padrão 5 minutos). E um intervalo para a digitalização única notificado arquivos (padrão 30 segundos). Verificação detectar arquivos alterados usando o atributo 'arquivo' (o OS redefine que um especialmente para fins de arquivamento). Somente arquivos modificados dessa forma são apoiados.

O serviço deixa um arquivo marcador especial para se certificar de que o backup alvo é exatamente uma cópia de segurança da fonte. Se a fonte está vazia e não contém um arquivo de marcador, o serviço executa restauração automática de backup. Assim, você pode facilmente destruir a unidade RAM e criá-la novamente com restauração automática de dados. É melhor usar uma unidade RAM que é capaz de criar uma partição no sistema de arranque para que ele funcione de forma transparente.

Outra solução que eu detectado recentemente é SuperSpeed SuperCache .

Esta empresa também tem um disco RAM, mas isso é outro software. SuperCache permite que você use RAM extra para caching em nível de bloco (que é muito diferente do cache de arquivo), e uma outra opção - espelho você dirige para a RAM completamente. Em qualquer cenário, você pode especificar quantas vezes para soltar os blocos sujos de volta para a unidade de disco rígido, tornando escreve como na unidade de RAM, mas o cenário espelho também faz lê como da unidade de RAM. Você pode criar uma pequena partição, por exemplo, 2 GB (usando Windows) e mapear toda a partição de RAM.

Uma coisa interessante e muito útil sobre essa solução - você pode mudar de cache e opções de espelhamento qualquer momento apenas instantaneamente com dois cliques. Por exemplo, se você quiser que o seu 2 GB de volta para gamimg ou máquina virtual - você pode simplesmente parar de espelhamento imediatamente e liberar memória de volta. Mesmo abriu identificadores de arquivo não quebrar - a partição continua a trabalhar, mas como uma unidade de costume.

EDIT: Eu também recomendo que você mover a pasta TEMP para te unidade de RAM, porque os compiladores costumam fazer um monte de trabalho com temperatura. No meu caso, me deu outro 30% da velocidade de compilação.

Respondeu 11/03/2012 em 07:31
fonte usuário

votos
2

Eu tive a mesma idéia e fiz alguma pesquisa. Eu encontrei as seguintes ferramentas que fazem o que você está procurando:

No entanto, o segundo que eu não conseguia começar a trabalhar em 64 bits do Windows 7 em todos, e não parece ser mantida no momento.

O disco VSuite RAM nas mãos de outros funciona muito bem. Infelizmente não pude medir qualquer ganho significativo de performance em comparação com o SSD disco no lugar.

Respondeu 09/11/2011 em 20:33
fonte usuário

votos
2
  1. Perfil. Certifique-se de fazer boas medições de cada opção. Você pode até comprar coisas que você já rejeitados, medi-los e devolvê-los, para que você saiba que você está trabalhando em bons dados.

  2. Obter uma grande quantidade de RAM. 2 GB DIMMs são muito baratos; 4 DIMMs GB são um pouco mais de US $ 100 / ea, mas isso ainda não é um monte de dinheiro em comparação com o computador peças custam apenas alguns anos atrás. Se você acabar com um disco de RAM ou apenas deixar o OS fazer a sua coisa, isso vai ajudar. Se você estiver executando Windows 32-bit, você precisa mudar para 64-bit para fazer uso de qualquer coisa mais de 3 GB ou mais.

  3. O Live Mesh pode sincronizar a partir de sua unidade de RAM local para a nuvem ou para outro computador, dando-lhe uma cópia de segurança up-to-date.

  4. Mova saídas apenas compilador. Mantenha o seu código-fonte no disco físico real, mas obj direta, .dll e .exe a ser criado na unidade RAM.

  5. Considere um DVCS . Clonar a partir da unidade real para um novo repositório na unidade de RAM. "empurrar" as alterações de volta para o pai, muitas vezes, dizer cada vez que todos os seus testes passar.

Respondeu 10/12/2008 em 00:31
fonte usuário

votos
2

Nós costumávamos fazer isso anos atrás para uma 4GL macro-compilador; se você colocar a biblioteca e suporte bibliotecas de macro e seu código em um disco RAM, compilando um aplicativo (em um 80286) passaria de 20 minutos para 30 segundos.

Respondeu 09/12/2008 em 22:32
fonte usuário

votos
1

Há muitas RAMDrives ao redor, use um desses. Desculpe, isso seria imprudente.

Somente se você trabalha inteiramente no disco RAM, que é bobagem ..

shell script pseudo-ish, 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

Dito isto, o compilador pode eventualmente fazer isso sem scripts adicionais .. Basta alterar o local de saída da compilação em um disco RAM, por exemplo, no Xcode, é em Preferências, Building, "Place construir produtos em:" e "Place Intermediate criar arquivos dentro:".

Respondeu 27/03/2009 em 06:31
fonte usuário

votos
1

O que pode ser super benéfico sobre até mesmo uma máquina de single-core é make paralelo. Disk I / O é um muito grande fator no processo de construção. Desova duas instâncias do compilador por núcleo CPU pode realmente aumentar o desempenho. Como exemplo blocos de um compilador de I / O o outro geralmente pode saltar para a parte CPU intensivo de compilação.

Você precisa ter certeza de que você tem a memória RAM para suportar isso (não deve ser um problema em uma estação de trabalho moderna), caso contrário, você vai acabar trocando e que derrota o propósito.

No GNU make você pode apenas usar -j[n], onde [n]é o número de processos simultâneos para desovar. Certifique-se de ter o seu direito árvore de dependência antes de tentar-lo embora ou os resultados podem ser imprevisíveis.

Outra ferramenta que é realmente útil (no paralelo make moda) é distcc . Ele funciona um deleite com GCC (se você pode usar GCC ou algo com uma interface de linha de comando similar). distcc realmente rompe-se a tarefa de compilação, fingindo ser as tarefas de compilador e desova em servidores remotos. Você chamá-lo da mesma maneira como você chamaria GCC, e você tirar proveito de -j do make opção [n] para chamar muitos processos de distcc.

Em um dos meus trabalhos anteriores tivemos uma compilação bastante intensivo sistema operacional Linux, que foi realizada quase diariamente por um tempo. Adicionando em um par de máquinas de criação dedicados e colocando distcc em algumas estações de trabalho para aceitar compilar trabalhos permitiu-nos para trazer o tempo de construção para baixo de uma metade de um dia para menos de 60 minutos para uma compilação OS + userspace completa.

Há um monte de outras ferramentas para velocidade compila existente. Você pode querer investigar mais do que criar discos de RAM; algo que parece que terá muito pouco ganho desde o OS está fazendo cache de disco com RAM. os designers OS gastar muito tempo recebendo direita caching para a maioria das cargas de trabalho; eles são (em conjunto) mais esperto do que você, então eu não gostaria de tentar e fazer melhor do que eles.

Se você mastigar RAM para o disco RAM, o sistema operacional tem RAM menos trabalho para cache de dados e para executar o seu código -> você vai acabar com mais troca e desempenho do disco pior do que de outra forma (nota: você deve perfil esta opção antes completamente descartando isto).

Respondeu 27/03/2009 em 05:29
fonte usuário

votos
1

Gostaria de saber se você poderia construir algo como um software RAID 1, onde você tem um disco / partição física como um membro, e um pedaço de RAM como um membro.

Eu aposto que com um pouco de ajustes e alguma configuração muito estranho se poderia obter Linux para fazer isso. Eu não estou convencido de que seria vale o esforço embora.

Respondeu 10/12/2008 em 01:06
fonte usuário

votos
0

Minha solução final para o problema é vmtouch: https://hoytech.com/vmtouch/ Esta ferramenta bloqueia a pasta atual em (ram) cache e daemonizes vmtouch em background.

sudo vmtouch -d -L ./

Colocar isso em rc shell para acesso rápido:

alias cacheThis = 'sudo vmtouch -d -L ./'

Procurei um roteiro preparado por um bom tempo, porque eu não queria desperdiçar um monte de tempo em escrever meu próprio ramdisk-rsync-script. Tenho certeza de que eu teria perdido alguns casos extremos, o que seria bastante desagradável se o código importante estava envolvido. E eu nunca gostei da abordagem polling.

Vmtouch parece ser a solução perfeita. Além disso, não perde a memória como um disco RAM tamanho fixo faz. Eu não fiz uma referência, porque 90% da minha fonte 1Gig + construir pasta já foram armazenados em cache, mas pelo menos ele se sente mais rápido;)

Respondeu 02/08/2017 em 10:08
fonte usuário

votos
0

A desaceleração disco que incorrer é principalmente escrever, e também possivelmente devido a scanners de vírus. Ela pode variar muito entre os sistemas operacionais também.

Com a ideia de que escreve são mais lento, eu seria tentado a configuração uma compilação onde intermediários (por exemplo, .oarquivos) e binários obter uma saída para um local diferente, como uma unidade RAM.

Você poderia, então, ligar esta pasta bin / intermediário a mídia mais rápidas (usando um link simbólico ou NTFS ponto de junção ).

Respondeu 27/09/2011 em 22:36
fonte usuário

votos
0

Algumas ideias em cima da minha cabeça:

Use Sysinternals' Process Monitor (não Process Explorer ) para verificar o que se passa durante uma compilação - o que irá deixá-lo ver se %temp%é usado, por exemplo (lembre-se que os arquivos de resposta são provavelmente criado com FILE_ATTRIBUTE_TEMPORARY que deve evitar gravações de disco, se possível, Apesar). Eu mudei o meu %TEMP%para um disco RAM, e isso me dá speedups menores em geral.

Obter um disco RAM que suporta o carregamento / salvar imagens de disco automaticamente, assim você não tem que usar scripts de inicialização para fazer isso. Seqüencial de leitura / gravação de uma imagem de disco único é mais rápido que a sincronização de um monte de arquivos pequenos.

Coloque suas grandes arquivos mais usados / cabeçalho no disco RAM, e substituir seus caminhos padrão do compilador para utilizar a unidade de RAM cópias. Ele provavelmente não vai dar que muito de uma melhoria após a primeira vez constrói, no entanto, como o sistema operacional armazena em cache os cabeçalhos padrão.

Mantenha seus arquivos de origem no seu disco rígido, e sincronizar para o disco RAM - não o contrário . Confira MirrorFolder para fazer a sincronização em tempo real entre pastas - Ele consegue isso através de um driver de filtro, portanto, apenas sincroniza o que é necessário (e só faz mudanças - uma gravação de 4 KB para um arquivo de 2 GB só irá causar uma gravação de 4 KB para a pasta de destino ). Descobrir como fazer o seu IDE de construção da unidade de RAM, embora os arquivos de origem estão em seu disco rígido ... e ter em mente que você vai precisar de uma grande unidade de RAM para grandes projetos.

Respondeu 27/03/2009 em 06:16
fonte usuário

votos
0

Isso soa como cache de disco que o seu sistema operacional e / ou seu disco rígido irá lidar automaticamente para você (em diferentes graus de desempenho, na verdade).

Meu conselho é, se você não gosta da velocidade do seu carro, comprar uma unidade de alta velocidade puramente para fins de compilação. Menos de trabalho de sua parte e você pode ter a solução para seus problemas de compilação.

Uma vez que esta questão foi originalmente solicitado, girando discos rígidos se tornaram miseráveis ​​tartarugas quando comparado com SSDs. Eles são muito perto do disco RAM originalmente solicitado em um SKU que você pode comprar de Newegg ou Amazon.

Respondeu 09/12/2008 em 22:16
fonte usuário

votos
-1

Assim como diz James Curran, o fato de que a maioria dos programas seguem a lei da localidade de referência, o código e página de dados contagem frequente será reduzida ao longo do tempo a um tamanho administrável pelo cache de disco OS.

discos de RAM eram úteis quando os sistemas operacionais foram construídas com limitações, como caches estúpidas (Win 3.x, Win 95, DOS). A vantagem disco RAM está perto de zero e se você atribuir um monte de RAM ele vai sugar a memória disponível para o gerenciador de cache do sistema, prejudicando o desempenho geral do sistema. A regra de ouro é: deixar seus kernel para fazer isso. Este é o mesmo que o "desfragmentação de memória" ou "otimizadores" programas: eles realmente forçar páginas fora de cache (de modo a obter mais RAM, eventualmente), mas fazendo com que o sistema para fazer um monte de página-falha ao longo do tempo quando seus programas carregados começam a pedir o código / dados que foi paginada.

Assim, para obter mais desempenho, obter um subsistema de hardware rápido disco I / O, talvez RAID, CPU mais rápida, melhor chipset (sem VIA!), RAM mais físico, etc.

Respondeu 27/03/2009 em 04:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more