58 Stimmen

RAM-Drive zum Kompilieren - gibt es so etwas?

Eine Antwort (siehe unten) auf eine der Fragen hier auf Stack Overflow brachte mich auf die Idee für ein großartiges kleines Stück Software, das für Programmierer überall von unschätzbarem Wert sein könnte.

Ich stelle mir eine RAM-Drive-Software vor, aber mit einem entscheidenden Unterschied: Sie würde einen echten Ordner auf meiner Festplatte spiegeln. Genauer gesagt - den Ordner, der das Projekt enthält, an dem ich gerade arbeite. Auf diese Weise würden alle Builds fast sofort erfolgen (oder zumindest um einige Größenordnungen schneller). Das RAM-Laufwerk würde seinen Inhalt im Hintergrund mit dem Festplattenlaufwerk synchronisieren und dabei nur ungenutzte Ressourcen verwenden.

Eine schnelle Google-Suche ergab nichts, aber vielleicht weiß ich einfach nicht, wie man googelt. Vielleicht kennt jemand eine solche Software? Vorzugsweise kostenlos, aber angemessene Gebühren wären auch OK.

Hinzugefügt: Es wurden einige Lösungen vorgeschlagen, die ich gleich zu Beginn verworfen habe. Sie lauten (in keiner bestimmten Reihenfolge):

  • Kaufen Sie ein schnelleres Festplattenlaufwerk ( SSD vielleicht oder 10K RPM). Ich möchte keine Hardware-Lösung. Software ist nicht nur potenziell billiger (Freeware, wer möchte?), sondern kann auch in Umgebungen eingesetzt werden, in denen Hardware-Modifikationen unerwünscht oder sogar unmöglich wären - beispielsweise im Büro.
  • Überlassen Sie das Zwischenspeichern dem Betriebssystem/der Festplatte - es weiß besser, wie es Ihren freien Arbeitsspeicher nutzen kann. Das Betriebssystem/die Festplatte verfügt über allgemeine Cache-Algorithmen, die alles zwischenspeichern und versuchen vorherzusagen, welche Daten in Zukunft am meisten benötigt werden. Sie haben keine Ahnung, dass für mich mein Projektordner Priorität hat. Und wie wir alle wissen, wird dort sowieso nicht viel zwischengespeichert ;)
  • Es gibt jede Menge RAM-Drives; verwenden Sie eine davon. Tut mir leid, das wäre leichtsinnig. Ich muss meine Daten immer dann auf die Festplatte zurücksynchronisieren, wenn ich ein bisschen Zeit habe. Im Falle eines Stromausfalls könnte ich es ertragen, die letzten fünf Minuten Arbeit zu verlieren, aber nicht alles seit meinem letzten Check-in.

Hinzugefügt 2: Eine Idee, die aufkam - verwenden Sie ein normales RAM-Laufwerk plus einen Hintergrund-Ordner-Synchronisierer (aber ich meine Hintergrund ). Gibt es so etwas?

Hinzugefügt 3: Interessant. Ich habe gerade ein einfaches RAM-Laufwerk bei der Arbeit ausprobiert. Die Wiederherstellungszeit sinkt von ~14 Sekunden auf ~7 Sekunden (nicht schlecht), aber die inkrementelle Erstellung dauert immer noch ~5 Sekunden - genau wie auf der HDD. Irgendwelche Ideen, warum? Es verwendet aspnet_compiler et aspnet_merge . Vielleicht machen sie etwas mit anderen temporären Dateien an anderer Stelle?

Hinzugefügt 4: Oh, eine schöne neue Reihe von Antworten! :) OK, ich habe noch ein paar Infos für alle Neinsager :)

Einer der Hauptgründe für diese Idee ist nicht die oben erwähnte Software (14 Sekunden Bauzeit), sondern eine andere, auf die ich damals keinen Zugriff hatte. Diese andere Anwendung hat eine 100 MB große Codebasis, und ihre vollständige Erstellung dauert etwa 5 Minuten. Ah ja, es ist in Delphi 5 Der Compiler ist also nicht allzu fortschrittlich. :) Wenn man den Quellcode auf ein RAM-Laufwerk legt, ergibt sich ein GROSSER Unterschied. Ich habe es unter eine Minute gebracht, glaube ich. Ich habe nicht nachgemessen. Also für alle, die sagen, dass das Betriebssystem Dinge besser zwischenspeichern kann - ich bin da anderer Meinung.

Verwandte Frage:

RAM-Disk zur Beschleunigung von IDE

Anmerkung zum ersten Link: Die Frage, auf die sie verweist, wurde gelöscht, weil sie ein Duplikat war. Sie fragte:

Was tun Sie, während Ihr Code kompiliert wird?

Und die Antwort von Dmitri Nesteruk die ich verlinkt habe, war:

Ich kompiliere fast augenblicklich. Das liegt zum Teil daran, dass meine Projekte klein sind, zum Teil an der Verwendung von RAM-Disks.

0 Stimmen

Warum ist eine Änderung der Hardware im Büro nicht möglich? Wir haben immer ein gewisses Budget zur Verfügung, wenn der Wert vorhanden ist. Außerdem bin ich bekannt dafür, Hardware mit meinem eigenen Geld zu kaufen, nur um meine Arbeit angenehmer zu gestalten.

2 Stimmen

In meinem Fall dauern die Builds ~15s inkrementell und ~30s vollständig. Nicht wirklich etwas, womit man den Chef überzeugen kann. Aber es wäre schön, wenn es 1s wäre :) Und ich möchte nicht mein eigenes Geld in so etwas investieren. Außerdem - es gibt viele Leute da draußen und jeder hat eine andere Geschichte. Viele haben vielleicht auch einen Nutzen davon.

4 Stimmen

Wenn ich Ihr Chef wäre, würde ich mich dafür interessieren, wie Sie die Bauzeit von 15-30 Sekunden auf 1 Sekunde reduzieren können. Jede Eine wahrnehmbare Verzögerung ist eine Gelegenheit zur Verbesserung. Die Produktivität der Entwickler wird durch jede Verzögerung direkt beeinträchtigt.

22voto

SCdF Punkte 53953

Unter Linux (Sie haben nie erwähnt, welches Betriebssystem Sie verwenden, daher ist diese könnte relevant sein) können Sie Blockgeräte aus dem RAM erstellen und sie wie jedes andere Blockgerät (d. h. eine Festplatte) einbinden.

Sie können dann Skripte erstellen, die beim Starten und Herunterfahren sowie in regelmäßigen Abständen auf und von diesem Laufwerk kopieren.

Sie könnten zum Beispiel Folgendes einrichten ~/code y ~/code-real . Ihr RAM-Block wird montiert bei ~/code beim Start, und dann alles von ~/code-real (die sich auf Ihrer Standardfestplatte befindet) wird hinüberkopiert. Beim Herunterfahren würde alles kopiert werden ( rsync 'd wäre schneller) zurück von ~/code a ~/code-real . Sie würden wahrscheinlich auch wollen, dass das Skript regelmäßig läuft, damit Sie bei einem Stromausfall usw. nicht viel Arbeit verlieren.

Ich tue das nicht mehr (ich habe es für Oper als die 9.5 Beta langsam war, nicht mehr nötig).

Hier erfahren Sie, wie Sie eine RAM-Disk unter Linux erstellen.

16voto

Adam Davis Punkte 89506

Ich bin überrascht, wie viele Leute meinen, dass das Betriebssystem besser in der Lage ist, Ihre Caching-Bedürfnisse herauszufinden als Sie in diesem speziellen Fall. Ich habe das zwar nicht für die Kompilierung gemacht, aber für ähnliche Prozesse, und am Ende habe ich eine RAM-Disk mit Skripten verwendet, die die Synchronisierung automatisiert haben.

In diesem Fall würde ich mich für ein modernes Versionskontrollsystem entscheiden. Bei jedem Kompilieren würde es den Quellcode (ggf. zusammen mit einem experimentellen Zweig) automatisch einchecken, so dass bei jedem Kompilieren die Daten abgespeichert würden.

Um mit der Entwicklung zu beginnen, starten Sie die RAM-Disk und ziehen die aktuelle Basislinie. Bearbeiten Sie den Text, kompilieren Sie, bearbeiten Sie, kompilieren Sie, usw. - während die Bearbeitungen für Sie gespeichert werden.

Wenn Sie zufrieden sind, führen Sie die abschließende Überprüfung durch, und Sie müssen nicht einmal Ihre normale Festplatte einbeziehen.

Aber es gibt Hintergrundsynchronisierer, die die Dinge automatisieren - das Problem ist, dass sie auch nicht für die Programmierung optimiert sind und gelegentlich vollständige Verzeichnis- und Dateiscans durchführen müssen, um Änderungen zu erfassen. Ein Quellcode-Kontrollsystem ist genau für diesen Zweck konzipiert, so dass es wahrscheinlich einen geringeren Aufwand bedeutet, obwohl es in Ihrem Build-Setup vorhanden ist.

Denken Sie daran, dass eine Hintergrundsynchronisierung im Falle eines Stromausfalls undefiniert ist. Sie müssten dann herausfinden, was gespeichert wurde und was nicht, wenn etwas schief geht. Mit einem definierten Speicherpunkt (bei jedem Kompilieren oder von Hand erzwungen) hätten Sie eine ziemlich gute Vorstellung davon, dass das Programm zumindest in einem Zustand ist, in dem Sie glauben, es kompilieren zu können. Verwenden Sie einen VCS und Sie können ihn leicht mit dem vorherigen Code vergleichen und sehen, welche Änderungen Sie bereits vorgenommen haben.

8voto

composer Punkte 431

参照 _Beschleunigung von emerge mit tmpfs_ ( Gentoo Linux wiki).

Das Beschleunigen von Kompilierungen mit RAM-Drives unter Gentoo war das Thema eines How-To, das vor vielen Äonen geschrieben wurde. Es bietet ein konkretes Beispiel dafür, was getan wurde. Das Wesentliche ist, dass alle Quell- und Build-Zwischendateien zum Kompilieren auf eine RAM-Disk umgeleitet werden, während die endgültigen Binärdateien zur Installation auf die Festplatte geleitet werden.

Ich empfehle auch, die Beibehaltung der Quelle auf der Festplatte zu prüfen, aber git push Ihre neuesten Quelltextänderungen in ein Klon-Respository, das sich auf der RAM-Disk befindet. Kompilieren Sie den Klon. Verwenden Sie Ihr bevorzugtes Skript, um die erstellten Binärdateien zu kopieren.

Ich hoffe, das hilft.

4voto

Joe McGrath Punkte 1443

Utilice https://wiki.archlinux.org/index.php/Ramdisk um die RAM-Disk zu erstellen.

Dann habe ich diese Skripte geschrieben, um Verzeichnisse auf und von der RAM-Disk zu verschieben. Die Sicherung erfolgt in einer tar Datei, bevor sie in die RAM-Disk verschoben wird. Der Vorteil dieser Vorgehensweise ist, dass der Pfad derselbe bleibt, so dass alle Ihre Konfigurationsdateien nicht geändert werden müssen. Wenn Sie fertig sind, verwenden Sie uramdir zurück auf die Festplatte zu bringen.

Bearbeiten: C-Code hinzugefügt, der jeden Befehl, der ihm gegeben wird, in einem Intervall im Hintergrund ausführt. Ich sende ihn tar con --update um das Archiv zu aktualisieren, wenn sich etwas ändert.

Ich glaube, dass diese Allzwecklösung besser ist als eine einzigartige Lösung für etwas sehr Einfaches. KISS

Stellen Sie sicher, dass Sie den Pfad zu rdbackupd ändern

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;
}

3voto

Dmitry Gusarov Punkte 1204

Ja, das gleiche Problem habe ich auch schon gehabt. Und nach erfolglosem Googeln habe ich gerade einen Windows-Dienst geschrieben, der das RAM-Laufwerk (eigentlich einen beliebigen Ordner, denn das RAM-Laufwerk kann z.B. in den Desktop eingebunden werden) faul sichert.

http://bitbucket.org/xkip/transparentbackup Sie können ein Intervall für die vollständige Überprüfung festlegen (Standard 5 Minuten). Und ein Intervall für die Überprüfung nur der gemeldeten Dateien (Standardwert 30 Sekunden). Scan erkennt geänderte Dateien anhand des Attributs "Archiv" (das Betriebssystem setzt dieses Attribut speziell für Archivierungszwecke zurück). Nur auf diese Weise geänderte Dateien werden gesichert.

Der Dienst hinterlässt eine spezielle Markierungsdatei, um sicherzustellen, dass die Zielsicherung genau eine Sicherung der Quelle ist. Wenn die Quelle leer ist und keine Markierungsdatei enthält, führt der Dienst eine automatische Wiederherstellung aus dem Backup durch. So können Sie das RAM Drive einfach zerstören und mit der automatischen Datenwiederherstellung neu erstellen. Es ist besser, ein RAM-Laufwerk zu verwenden, das in der Lage ist, beim Systemstart eine Partition zu erstellen, damit es transparent arbeitet.

Eine andere Lösung, die ich kürzlich entdeckt habe, ist SuperSpeed SuperCache .

Diese Firma hat auch eine RAM-Disk, aber das ist eine andere Software. SuperCache ermöglicht Ihnen die Verwendung von zusätzlichem RAM für die Zwischenspeicherung auf Blockebene (dies unterscheidet sich stark von der Zwischenspeicherung von Dateien), und eine weitere Option ist die vollständige Spiegelung Ihres Laufwerks in den RAM. In jedem Szenario können Sie angeben, wie oft schmutzige Blöcke auf die Festplatte zurückgeschickt werden sollen, so dass die Schreibvorgänge wie auf dem RAM-Laufwerk ablaufen, aber im Spiegelungsszenario auch die Lesevorgänge wie auf dem RAM-Laufwerk. Sie können eine kleine Partition erstellen, z. B. 2 GB (unter Windows), und die gesamte Partition dem RAM zuordnen.

Ein interessanter und sehr nützlicher Aspekt dieser Lösung ist, dass Sie die Zwischenspeicher- und Spiegelungsoptionen jederzeit mit nur zwei Klicks ändern können. Wenn Sie z. B. Ihre 2 GB für Spiele oder virtuelle Maschinen zurückhaben wollen, können Sie die Spiegelung sofort beenden und den Speicher wieder freigeben. Sogar geöffnete Datei-Handles werden nicht unterbrochen - die Partition arbeitet weiter, aber als normales Laufwerk.

EDIT: Ich empfehle auch dringend, den TEMP-Ordner auf ein anderes RAM-Laufwerk zu verschieben, da Compiler in der Regel viel Arbeit mit temp machen. In meinem Fall brachte es mir weitere 30 % Kompiliergeschwindigkeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X