2010-12-16 17 views
1

Ich habe Schwierigkeiten, den Speicher und den Zugriff auf ein großes Dataset innerhalb einer Ruby on Rails-Anwendung zu verwalten. Hier ist meine Anwendung auf den Punkt gebracht: Ich führe Dijkstra-Algorithmus, wie es sich auf ein Straßennetz bezieht, und dann zeigen Sie die Knoten, die es besucht, mit der Google Maps API. Ich verwende ein offenes Dataset der US road network, um das Diagramm zu erstellen, indem ich über zwei TXT-Dateien, die in dem Link angegeben werden, übergebe, aber ich habe Probleme beim Speichern dieser Daten in meiner App.Ruby on Rails - Speicherung und Zugriff auf große Datenmengen

Ich habe den Eindruck, dass ein großer Datensatz wie dieser kein ActiveRecord-Objekt ist - ich muss den Inhalt dieser Daten nicht ändern, sondern kann ihn lokal in einem Hash zwischenspeichern, um Ruby-Methoden auszuführen darauf. Ich habe ein paar Dinge ausprobiert, aber ich gerate in Schwierigkeiten.

  • Ich dachte, dass es am sinnvollsten wäre, die TXT-Dateien zu parsen und den Graphen im XML-Format zu speichern. Ich wäre dann in der Lage, das Diagramm in einen DB als Seed-Daten zu laden und den Graphen mit Node.all oder etwas in dieser Richtung zu greifen. Leider wird die YML-Datei zu groß, um von Rails verarbeitet zu werden. Das Ausführen eines Rake führt dazu, dass das System bei 100% für unendlich läuft ...

  • Als nächstes dachte ich, nun da ich die Daten nicht ändern muss, kann ich das Diagramm einfach jedes Mal erstellen, wenn die Anwendung als Start geladen wird von seiner "Initialisierung". Aber ich weiß nicht genau, wohin ich diesen Code schreiben soll, ich muss einige Methoden oder zumindest einen Datenblock ausführen. Und dann speichern Sie es in einer Art globaler/Session-Variable, auf die ich in allen Controllern/Methoden zugreifen kann. Ich möchte diesen großen Datensatz nicht weitergeben, sondern nur von überall darauf zugreifen können.

  • Dies ist die Art, wie ich es gerade mache, aber es ist einfach nicht akzeptabel. Ich analysiere die Textdateien, die das Diagramm auf einer Controller-Aktion erstellen, und hoffe, dass es Computing erhält, bevor der Server das Zeitlimit überschreitet.

  • Im Idealfall würde ich das Diagramm in einer Datenbank speichern, die ich den gesamten Inhalt ergreifen könnte, um lokal zu verwenden. Oder zumindest muss man die Daten nur einmal analysieren, wenn die Anwendung geladen wird, und dann könnte ich von verschiedenen Seitenaufrufen usw. darauf zugreifen. Ich denke, das wäre am effizientesten, aber ich stoße auf Hürden Moment.

    Irgendwelche Ideen?

    Antwort

    0

    Sie sind auf dem richtigen Weg. Es gibt mehrere Möglichkeiten, dies zu tun. Eine davon ist, in der Modellklasse, außerhalb jeder Methode eingesetzten Konstanten wie diese Beispiele:

    MY_MAP = Hash[ActiveRecord::Base.connection.select_all('SELECT thingone, thingtwo from table').map{|one| [one['thingone'], one['thingtwo']]}] 
    RAW_DATA = `cat the_file` # However you read and parse your file 
    CA = State.find_by_name 'California' 
    NY = State.find_by_name 'New York' 
    

    Diese werden erhalten ausgeführt einmal in einer Produktions App: wenn die Klasse des Modells geladen wird. Eine andere Option: Führen Sie diese Initialisierung in einem Initialisierer oder einer anderen Konfigurationsdatei durch. Siehe das Verzeichnis config/initializers.