ОЗУ для компиляции - есть такая вещь? - PullRequest
49 голосов
/ 10 декабря 2008

Ответ (см. Ниже) на один из вопросов прямо здесь, на Stack Overflow, дал мне идею для отличного небольшого программного обеспечения, которое могло бы быть бесценным для кодировщиков везде.

Я представляю программное обеспечение RAM-привода, но с одним принципиальным отличием - оно будет отражать реальную папку на моем жестком диске. Более конкретно - папка, в которой находится проект, над которым я сейчас работаю. Таким образом, любая сборка будет почти мгновенной (или, по крайней мере, на пару порядков быстрее). ОЗУ синхронизирует свое содержимое с жестким диском в фоновом режиме, используя только свободные ресурсы.

Быстрый поиск в Google ничего не показал, но, возможно, я просто не знаю, как Google. Возможно, кто-то знает о таком программном обеспечении? Желательно бесплатно, но разумные сборы тоже могут быть в порядке.

Добавлено: Было предложено несколько решений, от которых я отказался в самом начале. Они будут (в произвольном порядке):

  • Купите более быстрый жесткий диск ( SSD , может быть, или 10K об / мин). Я не хочу аппаратного решения. Мало того, что программное обеспечение может быть дешевле (бесплатно, кто-нибудь?), Но оно также может использоваться в средах, где модификации оборудования были бы нежелательны, если не невозможны - скажем, в офисе.
  • Пусть OS / HDD выполняет кэширование - он лучше знает, как использовать вашу свободную оперативную память. OS / HDD имеет общие алгоритмы кэширования, которые кэшируют все и пытаются предсказать, какие данные будут наиболее необходимы в будущее. Они понятия не имеют, что для меня приоритетом является папка моего проекта. И, как мы все хорошо знаем, они все равно мало что кешируют. ;)
  • Есть много RAM-дисков; используйте один из них. Извините, это было бы безрассудно. Мне нужно, чтобы мои данные были синхронизированы обратно на жесткий диск всякий раз, когда есть немного свободного времени. В случае перебоя в питании я мог потерять последние пять минут работы, но не все со времени моей последней проверки.

Добавлено 2: Идея, которая возникла, - использовать обычный RAM-накопитель и синхронизатор фоновых папок (но я имею в виду background ). Есть ли такая вещь?

Добавлено 3: Интересно. Я только что опробовал простой привод RAM на работе. Время восстановления уменьшается с ~ 14 секунд до ~ 7 секунд (неплохо), но приростная сборка по-прежнему составляет ~ 5 секунд - как на жестком диске. Есть идеи почему? Он использует aspnet_compiler и aspnet_merge. Возможно, они что-то делают с другими временными файлами в другом месте?

Добавлено 4: О, хороший новый набор ответов! :) Хорошо, у меня есть немного больше информации для всех вас, скептиков. :)

Одной из основных причин этой идеи является не упомянутое выше программное обеспечение (время сборки 14 секунд), а еще одно, к которому у меня не было доступа в то время. Это другое приложение имеет базу кода 100 МБ, а полная сборка занимает около 5 минут. Ах да, это в Delphi 5 , поэтому компилятор не слишком продвинут. :) Размещение источника на RAM-диске привело к большой разнице. Думаю, у меня это меньше минуты. Я не измерял. Так что для всех тех, кто говорит, что ОС может лучше кешировать вещи - я позволю себе не согласиться.

Смежный вопрос:

RAM диск для ускорения IDE

Примечание к первой ссылке: Вопрос, на который он ссылается, был удален, потому что он был дубликатом. Он спросил:

Что вы делаете во время компиляции вашего кода?

И ответ Дмитрий Нестерук , на который я ссылался, был:

Я компилирую почти мгновенно. Частично из-за небольших проектов, частично из-за использования RAM-дисков.

Ответы [ 18 ]

17 голосов
/ 10 декабря 2008

В Linux (вы никогда не упоминали, в какой ОС вы работаете, так что может быть релевантным), вы можете создавать блочные устройства из ОЗУ и монтировать их, как любое другое блочное устройство (то есть жесткий диск). .

Затем вы можете создавать сценарии, которые копируются на этот диск и с него при запуске / завершении работы, а также периодически.

Например, вы можете настроить его так, чтобы у вас были ~/code и ~/code-real. Ваш блок оперативной памяти монтируется при ~/code при запуске, а затем копируется все содержимое с ~/code-real (которое находится на вашем стандартном жестком диске). При выключении все будет скопировано ( rsync будет быстрее) обратно из ~/code в ~/code-real. Возможно, вы также захотите, чтобы этот сценарий запускался периодически, чтобы вы не потеряли много работы в случае сбоя питания и т. Д.

Я больше этим не занимаюсь (я использовал это для Opera , когда бета-версия 9.5 была медленной, больше не нужна).

Вот как создать RAM-диск в Linux.

15 голосов
/ 27 марта 2009

Я удивлен тем, как много людей полагают, что ОС лучше справляется с определением ваших потребностей в кэшировании, чем вы в этом специализированном случае. Хотя я не делал этого для компиляции, я делал это для аналогичных процессов, и в итоге я использовал RAM-диск со сценариями, которые автоматизировали синхронизацию.

В этом случае, я думаю, я бы использовал современную систему контроля версий. При каждой компиляции он автоматически проверяет исходный код (при необходимости на экспериментальной ветви), чтобы каждая компиляция приводила к сохранению данных.

Чтобы начать разработку, запустите RAM-диск и вытяните текущую базовую строку. Выполняйте редактирование, компилируйте, редактируйте, компилируйте и т. Д. - все время редактирования сохраняются для вас.

Пройдите финальную регистрацию, когда будете довольны, и вам даже не придется задействовать свой обычный жесткий диск.

Но есть фоновые синхронизаторы, которые будут автоматизировать вещи - проблема в том, что они также не будут оптимизированы для программирования и, возможно, потребуется периодически выполнять полное сканирование каталогов и файлов, чтобы отследить изменения. Система управления исходным кодом разработана именно для этой цели, поэтому она, вероятно, будет меньше накладных расходов, даже если она существует в вашей сборке.

Имейте в виду, что задача фоновой синхронизации в случае отключения питания не определена. В конечном итоге вам придется выяснить, что было спасено, а что нет, если что-то пойдет не так. С определенной точкой сохранения (при каждой компиляции или принудительно вручную) у вас будет довольно хорошая идея, что она, по крайней мере, находится в состоянии, когда вы думали, что сможете ее скомпилировать. Используйте VCS , и вы можете легко сравнить его с предыдущим кодом и посмотреть, какие изменения вы уже применили.

4 голосов
/ 10 декабря 2008

См. . Ускорение происходит с помощью tmpfs ( Gentoo Linux wiki).

Ускорение компиляции с использованием RAM-дисков под Gentoo было предметом практических рекомендаций, написанных много лет назад. Это конкретный пример того, что было сделано. Суть в том, что весь исходный файл и промежуточный файл сборки перенаправляются на диск RAM для компиляции, а окончательные двоичные файлы направляются на жесткий диск для установки.

Кроме того, я рекомендую изучить возможность сохранения вашего источника на жестком диске, но git push ваш последний источник изменится на репозиторий клонов, который находится на диске RAM. Скомпилируйте клон. Используйте ваш любимый скрипт для копирования созданных двоичных файлов.

Надеюсь, это поможет.

3 голосов
/ 26 октября 2011

Используйте https://wiki.archlinux.org/index.php/Ramdisk для создания RAM-диска.

Затем я написал эти сценарии для перемещения каталогов на RAM-диск и обратно. Резервное копирование выполняется в файл tar перед перемещением на диск RAM. Преимущество такого способа состоит в том, что путь остается тем же, поэтому все ваши файлы конфигурации не нужно менять. Когда вы закончите, используйте uramdir, чтобы вернуть на диск.

Редактировать: Добавлен код C, который будет запускать любую команду, заданную с интервалом в фоновом режиме. Я отправляю tar с --update для обновления архива, если есть какие-либо изменения.

Я считаю, что это универсальное решение превосходит создание уникального решения чего-то очень простого. KISS

Убедитесь, что вы изменили путь на 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;
}
3 голосов
/ 10 декабря 2008

Мы делали это несколько лет назад для макрокомпилятора 4GL ; если вы поместите библиотеку макросов и вспомогательные библиотеки и ваш код на RAM-диск, компиляция приложения (на 80286) займет от 20 минут до 30 секунд.

3 голосов
/ 10 декабря 2008

У меня нет именно того, что вы ищете, но сейчас я использую комбинацию Ramdisk и DRAM ramdisk . Поскольку это Windows, у меня жесткий предел 3 ГБ для основной памяти, что означает, что я не могу использовать слишком много памяти для RAM-диска. 4 ГБ на 9010 действительно впечатляют. Я позволил своей IDE хранить все свои временные данные на твердотельном RAM-диске, а также в репозитории Maven . На RAM-диске DRAM есть резервная батарея на флэш-карту. Это звучит как реклама, но это действительно отличная установка.

Диск DRAM имеет два порта SATA-300 и в большинстве тестов имеет среднее значение 0,0 мс;) Что-то для рождественского чулка?

3 голосов
/ 10 декабря 2008

Ваша ОС будет кэшировать вещи в памяти, как она работает. Диск RAM может показаться быстрее, но это потому, что вы не учитываете время «копирования на RAMDisk» и «копирования с RAMDisk». Выделение ОЗУ на виртуальный диск фиксированного размера просто уменьшает объем памяти, доступной для кэширования. ОС лучше знает, что должно быть в оперативной памяти.

2 голосов
/ 09 ноября 2011

У меня была та же идея, и я провел небольшое исследование. Я нашел следующие инструменты, которые делают то, что вы ищете:

Однако второй вариант, который мне вообще не удалось заставить работать на 64-битной Windows 7, и на данный момент он не поддерживается.

С другой стороны, RAM-диск VSuite работает очень хорошо. К сожалению, я не смог измерить сколько-нибудь значительного прироста производительности по сравнению с имеющимся диском SSD .

2 голосов
/ 10 декабря 2008
  1. Профиль. Убедитесь, что вы делаете хорошие измерения для каждого варианта. Вы даже можете купить вещи, которые вы уже отклонили, измерить их и вернуть их, чтобы вы знали, что работаете с хорошими данными.

  2. Получите много оперативной памяти. 2 ГБ DIMM очень дешевы; Модули DIMM емкостью 4 ГБ стоят чуть более 100 долларов США за штуку, но это все же не так много денег по сравнению с тем, что стоило компьютерных компонентов всего несколько лет назад. Независимо от того, получите ли вы диск с ОЗУ или просто дадите ОС сделать свое дело, это поможет. Если вы используете 32-разрядную версию Windows, вам нужно переключиться на 64-разрядную версию, чтобы использовать что-либо более 3 ГБ или около того.

  3. Live Mesh может синхронизироваться с локального ОЗУ в облаке или на другом компьютере, предоставляя актуальную резервную копию.

  4. Перемещение только выходных данных компилятора. Сохраняйте исходный код на реальном физическом диске, но прямые файлы .obj, .dll и .exe должны создаваться на диске RAM.

  5. Рассмотрим DVCS . Клонирование с реального диска в новый репозиторий на диске RAM. часто «передавайте» ваши изменения родителю, скажем, каждый раз, когда все ваши тесты пройдены.

2 голосов
/ 11 марта 2012

Да, я встречал ту же проблему. И после бесплодного поиска в Google я просто написал Windows Service для ленивого резервного копирования RAM-диска (фактически - любой папки, потому что RAM-диск может быть подключен, например, к рабочему столу).

http://bitbucket.org/xkip/transparentbackup Вы можете указать интервал для полного сканирования (по умолчанию 5 минут). И интервал для сканирования только уведомленных файлов (по умолчанию 30 секунд). Сканирование обнаруживает измененные файлы с использованием атрибута «архив» (ОС сбрасывает его специально для целей архивирования). Резервируются только файлы, измененные таким образом.

Служба оставляет специальный файл маркера, чтобы убедиться, что целевая резервная копия является именно резервной копией источника. Если источник пуст и не содержит файл маркера, служба выполняет автоматическое восстановление из резервной копии. Таким образом, вы можете легко уничтожить RAM-диск и создать его заново с автоматическим восстановлением данных. Лучше использовать RAM-диск, способный создать раздел при запуске системы, чтобы он работал прозрачно.

Другое решение, которое я недавно обнаружил, это SuperSpeed ​​SuperCache .

У этой компании также есть RAM-диск, но это другое программное обеспечение. SuperCache позволяет использовать дополнительную оперативную память для кэширования на уровне блоков (она сильно отличается от кэширования файлов), а также другой вариант - полностью зеркалировать диск в оперативную память. В любом сценарии вы можете указать, как часто отбрасывать грязные блоки обратно на жесткий диск, делая записи как на RAM-диске, но зеркальный сценарий также делает чтение как с RAM-диска. Вы можете создать небольшой раздел, например, 2 ГБ (используя Windows) и отобразить весь раздел в ОЗУ.

Одна интересная и очень полезная вещь в этом решении - вы можете изменить параметры кэширования и зеркалирования в любое время, просто мгновенно с помощью двух кликов. Например, если вы хотите вернуть 2 ГБ для игры или виртуальной машины - вы можете просто немедленно прекратить зеркалирование и освободить память. Даже открытые дескрипторы файлов не ломаются - раздел продолжает работать, но как обычный диск.

РЕДАКТИРОВАТЬ: я также настоятельно рекомендую вам переместить папку TEMP на RAM-диск, потому что компиляторы обычно много работают с temp. В моем случае это дало мне еще 30% скорости компиляции.

...