2 Stimmen

Wie bettet man eine schreibgeschützte Tabelle in eine DLL ein?

Meine DLL-Datei erfordert einige Codepage-Konvertierungskarten. Einige Zeichenketten müssen Zeichen für Zeichen umgewandelt werden. Derzeit habe ich mehrere große Wörterbücher erstellt, die diese Maps enthalten. Diese Dictionaries sind so groß, dass ich sie in 8 Dictionaries aufteilen musste, sonst konnte ich mit C# nicht kompilieren. Jetzt dauert es mehrere Sekunden, um die Anwendung zu laden, und sie verbraucht zu viel Speicher.

Ich würde mir wünschen, dass dies ein wenig effizienter ist. Vielleicht kann ich eine (oder mehrere) Tabelle in meine DLL einbetten und sie mit SQL oder LInQ oder so abfragen. Ich weiß, dass eine DLL nicht zum Speichern von Daten gedacht ist, aber meine Kunden werden eine einzige DLL-Datei zu schätzen wissen. Die Tabelle müsste nur schreibgeschützt sein und ~62000 Zeilen enthalten.

Zusätzliche Informationen:

Ich habe 10 Codeseiten, die ich in Unicode UND zurück konvertieren muss.

6 dieser Codepages sind Ein-Byte-Codepages und keine große Sache. (6 * 256 * 2 = 3072 Elemente)

4 davon sind Doppelbyte-Codepages, CP932, CP950, CP936 UND CP949, macht ~62000 * 2 = 124000 Einträge

Ich könnte die ersten 128 Zeichen eines beliebigen Zeichensatzes weglassen, aber das macht nicht viel Sinn.

Wenn ich dies in einer abfragbaren Datei speichern könnte, müsste ich nur ~62000 + 1536 Datensätze speichern und sie für die Konvertierung in beide Richtungen verwenden.

Das Nachschlagen von Zeichen in den aktuellen Wörterbüchern geht recht schnell. Der Speicherverbrauch ist nicht so wichtig, die Startzeit stört mich am meisten.

Die Suche muss schnell sein, im schlimmsten Fall muss ich etwa 20 Sätze pro Sekunde umwandeln. Eine Verzögerung ist nicht erwünscht, sie muss Schritt halten.

Ist dies möglich, und wie lässt sich dies am besten bewerkstelligen?

2voto

Aliostad Punkte 78595

Die Einbettung der Tabelle in eine Ressourcendatei hilft nicht beim Speicherverbrauch da beim Zugriff auf eine Baugruppe diese in den Speicher geladen werden muss - obwohl nicht immer die gesamte Datei geladen wird, aber sobald Sie auf die Ressource zugreifen, wird alles geladen.

Die beste Lösung, die mir in den Sinn kommt, ist eine Sqlite oder Sql Server Compact Datei das zusammen mit der DLL an den Kunden geschickt wird und die Daten enthält. Durch die Abfrage der lokalen DB-Datei wird der Speicherverbrauch reduziert.

1voto

Serghei Punkte 3886

Sie können die Ressourcendatei zum Speichern von Daten verwenden, wenn Sie die Anwendung in einer einzigen DLL kompilieren msdn

0voto

Kevin Hsu Punkte 1716

Ich hoffe, ich verstehe Ihre Bedürfnisse nicht falsch, aber vielleicht sollten Sie erwägen, ein großes Array anstelle eines Wörterbuchs zu verwenden. Angenommen, 16-Bit-Unicode-Code-Punkte sind alle, die Sie benötigen, um zu behandeln (Surrogat-Paare wirft einen Schraubenschlüssel in alles), erstellen Sie einfach eine 65.536 Zeichen-Tabelle.

Eine solche Tabelle würde 128K benötigen, wenn man von einem Zeichen auf ein Zeichen abbildet, oder mehr, wenn man auf andere Informationen abbilden muss. Sie werden jedoch nicht für den Overhead für interne Wörterbuchdatenstrukturen zahlen, und Sie können das Array deklarativ deklarieren:

private char[] mymap = new char[65536] { ... // 65536 Dinge }

Ich glaube, das sollte viel schneller gehen als das Laden einer Menge von Daten in ein Wörterbuch.

Auch hier gilt: Wenn dies nicht Ihren Anforderungen entspricht, geben Sie bitte an, wie Sie derzeit konvertieren, und ich werde es dann gerne ändern oder löschen.

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