Mehr

Was verursacht eine große Shapefile-Dateigröße und können Sie sie effektiv reduzieren?

Was verursacht eine große Shapefile-Dateigröße und können Sie sie effektiv reduzieren?


Ich habe ein Shapefile, das alle Landkreise Polens in einem Shapefile enthält. Das Shapefile wird von der zentralen Kartografieagentur bereitgestellt. Die Datei mit den von ihnen bereitgestellten Landkreisen ist etwa 30 MB groß.

Das gleiche Shapefile von GADM ist ~2 MB groß und enthält den gleichen Detaillierungsgrad (Counties) mit fast den gleichen Attributen. Die einzigen Informationen, die mir in GADM fehlen, sind die tatsächlichen Bezirkskennungsattribute, die ich verwenden möchte, um die Bezirke mit meinen Daten abzugleichen.

Ich verwende QGIS und habe versucht, Geometrien zu vereinfachen, um die Größe zu reduzieren. Ich habe auch SimpliPy, Generalizer ausprobiert, aber ich kann nicht mehr als 0,5% - 1% Größenreduzierung erzielen. Ich habe gegoogelt und Stackexchange durchsucht, aber keine Antwort auf meine Frage gefunden. Ich konnte auch keine Hilfe finden, um zu verstehen, warum die Größe von Shapefiles desselben Bereichs so stark variieren kann.


Beachten Sie, dass 'Detailgenauigkeit' ein relativer Begriff ist. Sie können dieselben Informationen enthalten, dh Landkreise, aber der Detaillierungsgrad gilt auch für die Linien, die die Grenzen bilden. Der eine könnte hundert Punkte verwenden, um einen Landkreis zu umreißen, der andere könnte ein paar tausend Punkte verwenden. Vereinfachen/Verallgemeinern ist das, was Sie auf den größeren verwenden, um sie besser in Einklang zu bringen, aber je nach Einstellungen hat dies möglicherweise nicht so viel Einfluss - oder kann es übertreiben. Oder es könnte sich um eine aufgeblähte / beschädigte Datei handeln, die repariert werden muss.

radouxju merkt an, dass normalerweise zwei Komponentendateien eines Shapefiles die größten sind - die .shp- oder Geometrieinformationen und die .dbf- oder Attributinformationen. Je nachdem, welches die Quelle der scheinbaren Blähungen ist, werden mögliche Lösungen diktiert.

Mapperz schlug http://www.mapshaper.org/ vor, eine Site, auf die Sie Ihre Datei zur Reparatur und Vereinfachung hochladen können. Beachten Sie, dass die Website anscheinend keine Option zum nicht vereinfachen, so dass es Daten ändern wird. Für eine direkte Reparatur benötigen Sie etwas wie Repair Geometry in ArcGIS oder GRASS' v.clean über QGIS. Eine Reparatur kann die Dateigröße zwar nicht reduzieren, aber auch die Daten nicht verändern. Ich bin mir nicht sicher, ob Mapshaper die Topologie beibehalten und während der Vereinfachung keine Splitter in angrenzende Polygongrenzen einführen kann wahrscheinlich zu beiden Linien gemacht werden.

RobinC stellte weiter klar, dass "Mapshaper Ihnen nur die .shp-Datei zur Verfügung stellt, und nachdem Sie diese reduziert haben, müssen Sie nur die alte .dbf-Datei umbenennen, damit Ihre Geometrie vereinfacht wird und Ihre Attribute unverändert bleiben."

user30184 hat sich die von Ihnen bereitgestellten Originaldateien angesehen und festgestellt, dass die größere tatsächlich deutlich mehr Scheitelpunkte hatte als die kleinere (2,25 Millionen gegenüber 68.000 in runden Zahlen), was den Größenunterschied in der .shp-Datei leicht erklärt.


Im Allgemeinen können Sie den Inhalt von .shp (Geometrie) oder .dbf (Attribut) reduzieren, indem Sie Generalisierungswerkzeuge aus anderen GIS-Paketen ausprobieren, wie @GISdirtsniffer betonte, oder indem Sie nicht verwendete Attributspalten löschen.

Insbesondere in Ihrem Fall, wenn wie gesagt

Das gleiche Shapefile von GADM ist ~2 MB groß und enthält den gleichen Detaillierungsgrad (Counties) mit fast den gleichen Attributen. Die einzige Information, die mir von GADM fehlt, ist das tatsächliche Attribut zur Bezirkskennung…

Dann können Sie die kleinere GADM-Geometrie anstelle der ursprünglichen zentralen Kartografieagentur verwenden. Konkret können Sie räumliche Verbindung , um das ursprüngliche Shapefile mit der GADM-Datei zu verbinden und Attribute wie die Bezirkskennung an das GADM-Shapefile anzuhängen, sodass Sie sowohl über die erforderlichen Attribute als auch über ein kleineres Shapefile verfügen.


Ich würde das Vereinfachen-Werkzeug verwenden, um die Anzahl der Scheitelpunkte zu reduzieren. Das ist mir schon zu oft begegnet.


Abgesehen von den offensichtlichen ( -Os -s ) kann das Ausrichten von Funktionen auf den kleinstmöglichen Wert, der nicht abstürzt (ich kenne die ARM-Ausrichtungsanforderungen nicht), einige Bytes pro Funktion herausquetschen.
-Os sollte Deaktivieren Sie die Ausrichtungsfunktionen bereits, aber dies kann immer noch auf einen Wert wie 4 oder 8 voreingestellt sein. Wenn Sie z.B. auf 1 ist mit ARM möglich, das kann einige Bytes sparen.

-ffast-math (oder das weniger aggressive -fno-math-errno ) setzt errno nicht und vermeidet einige Prüfungen, was die Codegröße reduziert. Wenn Sie, wie die meisten Leute, errno sowieso nicht lesen, ist das eine Option.

Die richtige Verwendung von __restrict (oder restriktiv) und const entfernt redundante Ladevorgänge, wodurch der Code schneller und kleiner (und korrekter) wird. Wenn reine Funktionen richtig als solche gekennzeichnet werden, werden Funktionsaufrufe eliminiert.

Das Aktivieren von LTO kann helfen, und wenn dies nicht verfügbar ist, kompilieren Sie alle Quelldateien auf einmal in eine Binärdatei ( gcc foo.c bar.c baz.c -o Programm statt foo.c , bar.c und baz. c zuerst auf Objektdateien und dann auf das Verknüpfen) hat einen ähnlichen Effekt. Es macht alles gleichzeitig für den Optimierer sichtbar, wodurch es möglicherweise besser funktioniert.

-fdelete-null-pointer-checks kann eine Option sein (beachten Sie, dass dies normalerweise mit jedem "O" aktiviert ist, aber nicht auf eingebetteten Zielen).

Das Einfügen von statischen Globals (Sie haben hoffentlich nicht so viele, aber immer noch) in eine Struktur kann eliminieren viel Overhead sie initialisieren. Das habe ich beim Schreiben meines ersten OpenGL-Loaders gelernt. Alle Funktionszeiger in einer Struktur zu haben und die Struktur mit = <> zu initialisieren, erzeugt einen Aufruf von memset , während die "normale" Initialisierung der Zeiger hundert Kilobyte Code generiert, nur um jeden einzeln auf Null zu setzen.

Vermeiden Sie statische Konstrukte, die nicht trivial sind lokal Variablen wie der Teufel (POD-Typen sind kein Problem). Gcc initialisiert nicht-triviale Konstruktor statische Locals threadsafe, es sei denn, Sie kompilieren mit -fno-threadsafe-statics , das verlinkt eine Menge von zusätzlichem Code (auch wenn Sie überhaupt keine Threads verwenden).

So etwas wie libowfat anstelle der normalen crt verwenden kann sehr Reduzieren Sie Ihre Binärgröße.


Versuchen Sie es mit der neuesten Version von 64-Bit-R und der neuesten Version von rgdal einfach einzulesen:

Wobei "shpfilename" der Dateiname ohne Erweiterung ist.

Wenn dies fehlschlägt, aktualisieren Sie Ihre Frage mit Details zu dem, was Sie getan haben, was Sie gesehen haben, Details zu den Dateigrößen - jede der "shpfilename.*"-Dateien, Details zu Ihrer R-Version, Ihrem Betriebssystem und Ihrer rgdal-Version.

Okay, die Frage bezieht sich eher auf eine Strategie für den Umgang mit großen Dateien, nicht auf "Wie liest man ein Shapefile in R."

Dieser Beitrag zeigt, wie man den Divide-Apply-Recombine-Ansatz als Lösung verwenden kann, indem Shapefiles untergeordnet werden.

Nehmen Sie ausgehend von der aktuellen Antwort an, dass Sie einen SpatialPolygonsDataFrame namens shpdata haben. shpdata hat ein Datenattribut (auf das über @data zugegriffen wird) mit einer Art Bezeichner für jedes Polygon (bei Tiger-Shapefiles ist es normalerweise so etwas wie 'GEOID'). Sie können diese Bezeichner dann in Gruppen durchlaufen und die shpdata für jeden kleinen Stapel von Polygonen untergeordnet/verarbeiten/exportieren. Ich schlage vor, entweder Zwischendateien als .csv zu schreiben oder sie in eine Datenbank wie sqlite einzufügen.


GTiff-Maske mit Shapefile in Python mit gdal, ogr, etc

OK, nach ein bisschen Fummelei habe ich ein Skript aus dem Site-Hyperlink in der zweiten Kommentarzeile angepasst. Der Zweck des Skripts besteht darin, ein GROßES Raster (dh das nicht in eine 32-Bit-Python 2.7.5-Anwendung passt) im GTiff-Format mit einem Shapefile mit mehreren Polygonen (jedes mit einem "Namen"-Datensatz) zu beschneiden/zu maskieren und die beschnittene Raster in ein "clip"-Unterverzeichnis, in dem jedes maskierte Raster nach dem "Namen" jedes Polygons benannt ist. Wie beim ursprünglichen Skript wird davon ausgegangen, dass sich GTiff und Shapefile in derselben Projektion befinden und sich korrekt überlappen, und wird verarbeitet

100 Masken/Sek. Ich habe dieses Skript jedoch modifiziert, um 1) mit einem Höhenraster mit Gleitkommawerten zu arbeiten, 2) nur das Fenster des größeren Rasters in den Speicher zu laden, der durch das aktuelle Polygon begrenzt ist (dh um die Speicherlast zu reduzieren), 2) exportiert GTiffs, die den richtigen (dh nicht verschobenen) Geo-Standort und Wert haben.

JEDOCH habe ich Probleme damit, dass jedes maskierte Gitter einen "rechtsseitigen Schatten" hat. Das ist für jeden

vertikale Linie in einem Polygon, bei der die rechte Seite dieser Linie außerhalb des gegebenen Polygons liegt, enthält das maskierte Gitter eine Rasterzelle rechts von dieser Polygonseite.

Daher ist meine Frage, was mache ich falsch, damit das maskierte Raster einen richtigen Schatten erhält?


4 Antworten 4

Fast alle Bildqualitätsverluste treten auf, wenn ein Bild zum ersten Mal als JPEG komprimiert wird. Unabhängig davon, wie oft ein JPEG neu komprimiert wird mit den gleichen Einstellungen, Generationsverluste sind auf Rundungsfehler beschränkt.

MCU-Grenzen bleiben intakt (8x8 Blöcke).

Chroma-Subsampling ist deaktiviert.

Konstante DQT (gleiche Qualitätseinstellung).

Jedoch, Rundungsfehler können groß sein für jede Iteration, dass die obigen Kriterien nicht erfüllt sind, und Es ist ratsam, Backups aller Originaldateien aufzubewahren.

Der JPEG-Kompressionsalgorithmus

Farbraum konvertieren. Farbinformationen auf Wunsch herunterrechnen (Chroma-Subsampling) (verlustbehaftet). Ohne Downsampling ist der Informationsverlust das Ergebnis von Rundungsfehler.

Segmentierung. Unterteilen Sie jeden Kanal in 8x8 Blöcke (MCU = Minimal Coding Unit). (verlustfrei)

Hinweis: Wenn Chroma-Subsampling aktiviert ist, können MCUs in Bezug auf das Originalbild effektiv 16x8, 8x16 oder 16x16 groß sein. Die MCUs sind jedoch immer noch alle 8x8-Blöcke.

Diskrete Kosinustransformation (DCT) auf jeder MCU. Informationsverlust ist das Ergebnis von Rundungsfehler.

Quantisierung. Der Wert in jeder Zelle der MCU wird durch eine Zahl dividiert, die in einer Quantisierungstabelle (DQT) angegeben ist. Die Werte werden abgerundet, von denen viele Null werden. Dies ist der primäre verlustbehaftete Teil des Algorithmus.

Zick-Zack-Scan. Ordnen Sie die Werte in jeder MCU in eine Zahlenfolge um, die einem Zick-Zack-Muster folgt. Die während der Quantisierung aufgetretenen Nullen werden gruppiert. (verlustfrei)

DPCM = Differentielle Pulscodemodulation. Konvertieren Sie die Zahlenfolgen in eine einfacher zu komprimierende Form. (verlustfrei)

RLE = Lauflängencodierung. Aufeinanderfolgende Nullen werden komprimiert. (verlustfrei)

Entropie/Huffman-Codierung. (verlustfrei)

JPEGs neu komprimieren

Beachten Sie, dass Downsampling der Farbkanäle und Quantisierung sind die einzigen bewusst verlustbehafteten Schritte. Abgesehen von Rundungsfehlern sind alle anderen Schritte verlustfrei. Sobald die Quantisierung stattgefunden hat, führt das Umkehren und Wiederholen des Schrittes zu identischen Ergebnissen. Mit anderen Worten, Re-Quantisierung (mit der gleichen DQT) ist verlustfrei.

Grundsätzlich ist es möglich, einen Resampling-Algorithmus zu erstellen, der nach dem ersten Durchlauf verlustfrei ist. Bei der Implementierung in ImageMagick können sich die Farben jedoch drastisch verschieben, bevor der stationäre Zustand erreicht wird, wie in diesem Bild zu sehen ist.

Unter optimalen Bedingungen würde das erneute Komprimieren eines JPEGs mit denselben Qualitätseinstellungen zu genau demselben JPEG führen. Mit anderen Worten, JPEGs neu zu komprimieren ist möglicherweise verlustfrei. In der Praxis ist die Neukomprimierung von JPEGs nicht verlustfrei, sondern unterliegt Rundungsfehlern und wird durch diese eingeschränkt. Obwohl Rundungsfehler konvergieren oft schließlich gegen Null, damit genau das gleiche Bild neu erstellt wird, Chroma-Subsampling kann zu erheblichen Farbänderungen führen.

Demonstration (gleiche Qualitätseinstellung)

Ich habe das folgende Bash-Skript geschrieben, das ImageMagick verwendet, um eine JPEG-Datei mit einer bestimmten Qualitätseinstellung wiederholt neu zu komprimieren:

Nachdem ich es einige hundert Iterationen laufen ließ, habe ich md5sum auf den Ergebnissen ausgeführt:

Wir sehen, dass der Rundungsfehler tatsächlich gegen Null konvergiert ist und das exakt gleiche Bild wird immer und immer wieder reproduziert.

Ich habe dies mehrmals mit unterschiedlichen Bildern und Qualitätseinstellungen wiederholt. Normalerweise wird ein stationärer Zustand erreicht, und die genau Das gleiche Bild wird immer wieder reproduziert.

Was ist mit den Ergebnissen von @mattdm?

Ich habe versucht, die Ergebnisse von mattdm mit Imagemagick auf Ubuntu 18.04 zu replizieren. Das Original war eine Rohkonvertierung in TIFF in Rawtherapee, aber es scheint nicht mehr verfügbar zu sein. Stattdessen habe ich die vergrößerte Version genommen und auf die Originalgröße (256x256) verkleinert. Dann habe ich wiederholt auf 75 komprimiert, bis ich Konvergenz erreichte. Hier ist das Ergebnis (Original, 1, n, Differenz):

Meine Ergebnisse sind anders. Ohne das wahre Original ist der Grund für den Unterschied nicht zu ermitteln.

Was ist mit der Montage von @ths?

Ich habe das Bild von der oberen linken Ecke der Montage bis zur Konvergenz bei 90 neu komprimiert. Dies ist das Ergebnis (Original, 1, n, Differenz):

Nach dem Aktivieren von Chroma-Subsampling ändern sich die Farben bis der stationäre Zustand erreicht ist.

Wechseln zwischen wenigen Einstellungen

Durch Modifizieren der Variablen q2 kann die Qualitätseinstellung auf einen Satz gleichmäßig verteilter Werte begrenzt werden.

Für ein kleine Anzahl von Einstellungsmöglichkeiten, Gleichgewicht kann schließlich erreicht werden, die angezeigt wird, wenn md5-Werte wiederkehren. Es scheint, je größer der Satz, desto länger dauert es und desto schlechter wird das Bild, bis ein Gleichgewicht erreicht ist.

Was im Gleichgewicht zu passieren scheint, ist, dass der DCT-Koeffizient vor der Quantisierung alle (oder die meisten) der Quantenwerte teilbar sein muss. Wenn beispielsweise zwischen zwei DQTs gewechselt wird, bei denen der DCT-Koeffizient abwechselnd durch 3 und 5 geteilt wird, wird das Gleichgewicht erreicht, wenn der DCT-Koeffizient durch 15 teilbar ist. Dies erklärt, warum der Qualitätsabfall viel größer ist als der Unterschied zwischen den ursprünglichen Einstellungen.

Wechseln zwischen einer größeren Anzahl von Einstellungen

Eeyore ist nicht glücklich, wenn q2 so geändert wird:

Verwenden Sie ffmpeg , um ein Video zu erstellen:

Die ersten 9999 Iterationen zu beobachten, ist fast so, als würde man Wasser kochen sehen. Vielleicht möchten Sie die Wiedergabegeschwindigkeit verdoppeln. Hier ist Eeyore nach 11999 Iterationen:

Was passiert, wenn sich die MCU-Grenzen ändern?

Wenn Änderungen eine begrenzte Anzahl von Malen auftreten, ist es wahrscheinlich, dass wiederholtes erneutes Komprimieren den stationären Zustand erreicht. Wenn bei jeder Iteration Änderungen auftreten, verschlechtert sich das Bild wahrscheinlich auf ähnliche Weise wie bei einer DQT-Änderung.

Was ist mit der Bearbeitung?

Die Wirkung der Neukomprimierung nach der Bearbeitung hängt von der jeweiligen durchgeführten Bearbeitung ab. Wenn Sie beispielsweise nach dem Reduzieren von JPEG-Artefakten mit derselben Qualitätseinstellung speichern, werden dieselben Artefakte wieder eingeführt. Das Anwenden einer lokalisierten Änderung, z. B. eines Reparaturpinsels, wirkt sich jedoch nicht auf Bereiche aus, die nicht berührt wurden.

Der größte Rückgang der Bildqualität tritt auf, wenn die Datei zum ersten Mal mit einer bestimmten Qualitätseinstellung komprimiert wird. Ein anschließendes erneutes Komprimieren mit der gleichen Einstellung sollte keine größere Änderung als den Rundungsfehler bewirken. Ich würde also erwarten, dass die Bearbeitungs- und Speicherzyklen bei einer bestimmten Qualitätseinstellung wie jedes andere Bild aussehen, das mit derselben Qualitätseinstellung gespeichert wurde (solange die MCU-Grenzen intakt bleiben und Chroma-Subsampling ist deaktiviert).

Was ist mit diesen Videos?

Qualitätseinstellungen ändern. (Die meisten Videos.)

Unterbrechung der MCU-Grenzen. (Zuschneiden oder Drehen)

Andere Manöver, die die Bildqualität reduzieren oder den JPEG-Algorithmus stören?

Kann ich meine Originale mit neu komprimierten JPEGs überschreiben?

Es ist ratsam, Backups aller Originaldateien aufzubewahren, Wenn Sie jedoch versehentlich einen überschreiben, ist der Schaden wahrscheinlich begrenzt. Es wäre auch in Ordnung, in JPEG zu arbeiten mit deaktiviertem Chroma-Subsampling.


3 Antworten 3

Der wichtige Unterschied besteht hier zwischen Cache-Fehlern, die durch die Größe Ihres Datensatzes verursacht werden, und Cache-Fehlern, die durch die Art und Weise, wie Ihr Cache und die Datenausrichtung organisiert sind, verursacht werden.

Nehmen wir an, Sie haben einen 32 KB direkt zugeordneten Cache und betrachten die folgenden 2 Fälle:

Sie iterieren wiederholt über ein 128k-Array. Es gibt keine Möglichkeit, dass die Daten in diesen Cache passen, daher sind alle Misses kapazitätsbedingt (außer dem ersten Zugriff auf jede Zeile, der ein obligatorischer Miss ist und bleiben würde, selbst wenn Sie Ihren Cache unendlich vergrößern könnten).

Sie haben 2 kleine 8k-Arrays, aber leider sind beide ausgerichtet und auf die gleichen Sets abgebildet. Das bedeutet, dass sie zwar theoretisch in den Cache passen könnten (wenn Sie Ihre Ausrichtung korrigieren), sie jedoch nicht die volle Cache-Größe nutzen und stattdessen um die gleiche Gruppe von Sets konkurrieren und sich gegenseitig verprügeln. Dies sind Konfliktfehler, da die Daten passen könnten, aber organisationsbedingt immer noch kollidieren. Das gleiche Problem kann bei satzassoziativen Caches auftreten, wenn auch seltener (sagen wir, der Cache ist 2-Wege, aber Sie haben 4 ausgerichtete Datensätze. ).

Die beiden Typen sind in der Tat verwandt, man könnte sagen, dass Sie bei hoher Assoziativität, Satzverzerrung, korrekter Datenausrichtung und anderen Techniken die Konflikte reduzieren können, bis Sie meistens echte Kapazitätsausfälle haben, die unvermeidlich sind.


11 Antworten 11

Durch Austauschen des Inhalts mit einem anderen Vektor wird die Kapazität getauscht.

Swap() würde nur die interne Datenstruktur ändern.

Mit C++11 können Sie die Memberfunktion slim_to_fit() aufrufen. Im Normentwurf Abschnitt 23.2.6.2 heißt es:

Shrink_to_fit ist eine unverbindliche Aufforderung, capacity() auf size() zu reduzieren. [Hinweis: Die Anfrage ist unverbindlich, um Spielraum für implementierungsspezifische Optimierungen zu lassen. —Endnotiz]

Sehen Sie sich Scott Meyers effektiver STL-Artikel 17 an.

Grundsätzlich können Sie die Speichergröße eines std::vector nicht direkt reduzieren. resize() und reseve() reduzieren niemals den tatsächlichen Speicherbedarf eines Containers. Der "Trick" besteht darin, einen neuen Container der richtigen Größe zu erstellen, die Daten zu kopieren und mit dem aktuellen Container zu tauschen. Wenn wir einen Container ausräumen möchten, ist dies einfach:

Wenn wir die Daten kopieren müssen, müssen wir die Kopie tun:

Dadurch wird ein neuer Vektor mit den Daten des alten erstellt und die Kopie erstellt, die bei jeder Operation erforderlich wäre, die den gewünschten Effekt hat. Dann tauscht der Aufruf von swap() nur die internen Puffer zwischen den Objekten aus. Am Ende der Zeile wird der erstellte temporäre Vektor gelöscht, aber er hat den Mut des alten Vektors und der alte Vektor hat den Mut der neuen Kopie, die genau die Größe hat, die wir brauchen.


7 Antworten 7

Überprüfen Sie Ihre Berichtsanfragen. Hast du welche, die DISTINCT enthalten? Hat einer von ihnen einen kartesischen Join?

Greifen die Berichtsabfragen als Mitglieder eines Joins auf Verbindungsserver zu? Wenn dies der Fall ist, kann dies dazu führen, dass das tempdb-Protokoll und die Datenbank wachsen.

Wenn die Berichte morgens laufen, stürzt einer von ihnen ab?

Wir hatten ein ähnliches Problem, nachdem wir einen PSS-Anruf mit Microsoft getätigt und das Problem eingehend untersucht hatten, haben wir die folgenden möglichen Ursachen und Lösungen untersucht.

Die wahrscheinliche Ursache für die Symptome liegt darin, dass Festplatten/LUNs, auf denen Benutzerdatenbanken platziert werden, schwerwiegende E/A-Antwortprobleme aufweisen. Dies führt dazu, dass der automatische Prüfpunkt für Benutzerdatenbanken sehr lange dauert.

Checkpoint on tempdb tritt jetzt nur auf, wenn das tempdb-Protokoll zu 70 % voll ist und hat auch eine niedrigere Priorität als Benutzerdatenbank-Checkpoints. Wenn also ein automatischer Prüfpunkt für die Benutzerdatenbank/en ausgegeben wird und versucht wird, abzuschließen, führt die tempdb-Protokolldatei aufgrund der starken tempdb-Nutzung dazu, dass sich die tempdb-Protokolldatei bei 70% der Protokollnutzung schnell füllt, der tempdb-Prüfpunkt tritt auf, wird jedoch hinter dem Benutzerdatenbank-Prüfpunkt in die Warteschlange gestellt .

In der Zeit, die der Prüfpunkt der Benutzerdatenbank benötigt, um die tempdb-Protokolldatei zu beenden, wird sie immer wieder gefüllt, und wenn Autogrow eingestellt ist, wächst die Protokolldatei, wenn sie mehr Speicherplatz benötigt. Dies ist der Grund, warum die Protokolldatei ständig wächst.

Zusammenfassend lässt sich sagen, dass die wahrscheinlichste Ursache für die von Ihnen beschriebenen Symptome eine schlechte E/A-Reaktion von den Festplatten/LUNs für Ihre Benutzer- und/oder tempdb-Datenbank/Protokolldateien ist.

Wir haben das Problem umgangen, während wir das I/O-Subsystem aussortiert haben, indem wir eine Warnung eingerichtet haben, die ausgelöst wurde, wenn die tempdb-Protokolldatei zu 75% voll war, und als Reaktion darauf einen Job ausführten, der einen manuellen "CHECKPOINT" erzwang (der Vorrang vor dem automatischen System hat). checkpoints), das Löschen des tempdb-Protokolls, um zu verhindern, dass es auf unbestimmte Zeit automatisch wächst. Es ist immer noch eine gute Idee, die Protokolldatei für alle anderen Fälle auf Auto Grow zu belassen. Außerdem empfehle ich Ihnen dringend, die Größe der tempdb-Protokolldatei auf eine für Ihre Umgebung sinnvolle Größe zu reduzieren, nachdem Sie den Fix eingefügt haben.

Auf was ist das Wiederherstellungsmodell in der temporären Datenbank eingestellt? Wenn es nicht auf Einfach festgelegt ist, legen Sie es auf Einfach fest. Dies sollte verhindern, dass es wächst. Wenn es bereits auf Einfach eingestellt ist, würde ich sagen, dass ein zugrunde liegendes Problem behoben werden muss und jeder Versuch, die Datei zu verkleinern, lediglich die Symptome des Problems und nicht die Ursache behandelt.

Ich habe die letzten Stunden damit verbracht, das zu lesen und mir Notizen zu machen

Es gibt viele Details und Vorschläge zur Fehlerbehebung. Es scheint, dass Ihre tempdb, wenn sie nicht erweitert wird und nie aufhört, zu wachsen, wahrscheinlich nur den Platz einnimmt, den sie benötigt und anfangs auf diese Größe hätte konfiguriert werden sollen. Es gibt einen Abschnitt zum Schätzen des für Ihre tempdb erforderlichen Speicherplatzes sowie zum Aufspüren von Speicherplatz in tempdb. Aus diesem Grund werde ich als erstes tempdb auf ein größeres Laufwerk verschieben und sehen, was von dort aus passiert.

Es gibt einen Abschnitt mit dem Titel 'Speicherplatz für tempdb-Protokollierung erforderlich' der angibt, welche Funktionen das Protokoll verwenden, gibt es einen anderen früheren Abschnitt, der die Obermenge der Funktionen beschreibt, die tempdb verwenden.

Der Abschnitt mit dem Titel 'E/A überwachen' hat ein paar Ideen zu Leistungsindikatoren zum Anschauen, ein kurzer Blick auf meinen Server bringt diese in Ihr-vermutlich-ein-io-Engpass-Gebiet. Ich werde diese eine Weile beobachten und sehen, wie sich die Dinge entwickeln. Die tempdb-Protokolldatei war auch tatsächlich zu weniger als 50% ausgelastet, was zu der Idee passt, dass sie heute Morgen unter Last erweitert wurde und diesen Platz seitdem beibehalten hat.

Ich gehe davon aus, dass die Größe, auf die es angewachsen ist, die Größe ist, die es sein muss. Überwachen Sie diese Größe in Zukunft und stellen Sie sicher, dass es auf jedem Laufwerk Platz für Wachstum gibt. Wie von einigen hier vorgeschlagen, werde ich untersuchen, was ausgeführt wird, wenn das temporäre Protokoll erweitert wird, und sehen, ob dort etwas optimiert werden kann. Ich werde auch diese io-Leistungsindikatoren im Auge behalten, um zu sehen, ob etwas bearbeitet werden muss.

Es gab noch einen weiteren interessanten Abschnitt mit dem Titel 'Upgrade auf SQL Server 2005' was darauf hinweist, dass tempdb im Jahr 2005 für mehr Dinge als im Jahr 2000 verwendet wird (sowohl neue Funktionen als auch vorhandene Funktionen, die zuvor nicht tempdb verwendet haben). Ich habe erst vor kurzem auf 2005 aktualisiert, daher könnte dies ein Grund dafür sein, dass dies plötzlich zu einem Problem geworden ist. Ich kann mich nicht erinnern, dies irgendwo anders in Bezug auf das Upgrade auf 2005 gesehen zu haben, was ein bisschen mühsam ist.


Das XLSM-Format dient dazu, Excel mit Open XML kompatibel zu machen, aber es gibt nur sehr wenige Fälle, in denen wir tatsächlich das XML-Format von Excel verwenden. Dies reduziert die Größe um fast 50%, wenn nicht mehr

Wenn Sie beispielsweise den Aktienkurs etwa 10 Jahre lang speichern müssen und Open, High, Low, Close für eine Aktie speichern müssen, würde dies zu (252*10) * (4) Zellen werden verwendet

Statt separate Spalten für Open,High,Low,Close zu verwenden, speichern Sie sie in einer einzigen Spalte mit einem Feldtrennzeichen Open:High:Low:Close

Sie können jederzeit ganz einfach eine Funktion schreiben, um Informationen aus der einzelnen Spalte zu extrahieren, aber es wird fast 2/3 des Speicherplatzes freigeben, den Sie gerade belegen


Düsenverhalten

Der nächste Teil, den wir uns ansehen müssen, ist das Verhalten im Hotend und in der Düse. Unter perfekten Bedingungen würde die Heizzone das Filament vollständig aufschmelzen und eine stabile, laminare Strömung durch die Düse gewährleisten, während sie das Material vom Ausgangsdurchmesser bis zur Extrusionsbreite einschnürt.

Angenommen, unser Filament bleibt laminar, dann ist der Materialfluss genau der gleiche wie der Materialfluss, nichts stottert. Aber wenn die Faktoren im Rohr ausgeschaltet sind, dann bekommen wir turbulente Strömung. weiterlesen

Die Strömung ist also nicht unbedingt linear, und wir können leicht mehrere Faktoren identifizieren, die das Verhalten in der Düse beeinflussen. Lassen Sie uns einen kurzen Überblick über verschiedene Faktoren geben:

  • Materialien dehnen sich beim Erhitzen unterschiedlich (mit Faktor $alpha$ ) aus und beeinflussen somit das Volumen des Materials in der Düse, was sich wiederum auf den Volumenstrom und den Druck in der Düse auswirkt. Das ist Temperatur und materialabhängig. weiter dazu
  • Die Viskosität des Materials hat einen großen Einfluss auf das Fließverhalten. Die meisten Kunststoffviskositäten sind temperaturabhängig aber auch materialabhängig
  • Die Düsenform kann einen geringen Einfluss auf die Durchflussmenge haben (vor allem bei ungleichmäßiger oder rauer). Der einflussreichste Faktor ist jedoch der Düsendurchmesser, was sich direkt auf die Durchflussmenge auswirkt.

Wie all das den Fluss in einer Düse beeinflusst

Nehmen wir an, dass der Durchfluss gewährleistet ist und wir die Reibung der Düse am Material ignorieren können. Dann erhalten wir die Freeman-Formel für Flow:

$Q=Av$ wobei Q der Volumenstrom in 0,001 m³/s, A die Düsenfläche in m², v die Austrittsgeschwindigkeit in m/s ist.

$A=r^2pi$ ist die bekannte Kreisformel, r ist der Düsenradius, also der halbe Düsendurchmesser
$ A_<0,4 ext< mm Düse>>=1,256 imes10^<-7> ext< m>^2$

$v=sqrt<2P>$ ist die Bernoulli-Gleichung, die uns sagt, dass die Strömungsgeschwindigkeit druckabhängig ist (siehe Düsenverhalten Punkt 1). Als Ergebnis erhalten wir, dass der Volumenstrom durch unsere Düse wie folgt vom Druck abhängt:

$Q=sqrt 2 pi imes r imessqrt P$
$ Q_<0,4 ext< mm Düse>>=1,777 imes10^<-7> ext< m>^2 imessqrt

$

Der Druck in der Düse ist die Summe aus dem Druck, der durch die Kraft erzeugt wird, mit der das Material vom Extruder eingedrückt wird ( $P_F=F/A'$ ) und der Materialausdehnung in der Düse ( $P_e$ ).

Wie wir im Extruder-Teil festgestellt haben, hängt die Extrusionsrate etwas vom effektiven Durchmesser des Wälzfräsers $d_e$ ab. Auch der Wirkdurchmesser des Wälzfräsers hat Einfluss auf den Druck in der Düse: Wie tief die Zähne in das Filament einschneiden, bestimmt die Kraftübertragung. Der andere Faktor, der die über das Filament übertragene Kraft beeinflusst, ist die Extrusionsgeschwindigkeit $v_e$ , daher schreiben wir $F(d_e,v_e)$ . Darüber hinaus spielt der tatsächliche Filamentdurchmesser $A'$ eine weitere Rolle, wie unter Filamenteffekten untersucht wurde. Die Wärmeausdehnung, die vom Materialkoeffizienten $alpha$ und der Temperaturerhöhung $Delta T$ abhängig ist, erhöht den Druck in der Düse, daher schreiben wir $P_e(alpha,Delta T)$ . Der Ausdruck für den Volumenstrom aus der Düse lautet also

$Q=sqrt 2 imes r pi imessqrt +P_e(alpha,Delta T)>$

Ob diese Strömung laminar und nicht-turbulent ist, lässt sich aus der begleitenden Reynolds-Zahl $Re$ ablesen, die von der (dynamischen/kinematischen) Viskosität $mu=frac u ho$ (rho ist die Dichte) abhängig ist. Die Viskosität ist temperaturabhängig, daher schreiben wir $ u(T)$ . Der letzte Faktor in der Formel für die Reynolds-Zahl ist der hydraulische Durchmesser $D_H$ , der in unserem Fall auf den Durchmesser der Düse hinausläuft, also $D_H=2r$ . Für unseren Fall ergibt das:


Schau das Video: Kako smanjiti velicinu dadotekefajlaigrice