2016-05-03 4 views
0

Ich verwende Delphi 7 Enterprise unter Windows 7 64 Bit. Mein Computer hatte 16 GB RAM.kbmmemtable EOutOfMemory-Fehler nach LoadFromDataset

Ich versuche, kbmMemTable 7.70.00 Professional Edition (http://news.components4developers.com/products_kbmMemTable.html) zu verwenden.

Meine Tabelle hat 150.000 Datensätze, aber wenn ich versuche, die Daten von Datensatz zu dem kbmMemTable es nur Kopien 29.000 Datensätze zu kopieren, und ich bekomme diese Fehlermeldung: EOutOfMemory

sah ich diese Meldung: https://groups.yahoo.com/neo/groups/memtable/conversations/topics/5769, aber es hat mein Problem nicht gelöst.

+0

Was passiert, wenn Sie durch das Erzeugen sie in Code versuchen, hinzuzufügen, um die gleiche Anzahl von Datensätzen zu Ihrem KbmMemtable passiert? – MartynA

+0

Delphi 7 kann nur auf bis zu 2 GB Arbeitsspeicher zugreifen, unabhängig davon, wie viel Ihr Computer installiert hat. Es ist eine 32-Bit-Anwendung. Wie viele Spalten in jeder Zeile Ihres Datasets? Und welche Größe haben die Säulen? 150K-Zeilen sind nicht viel, es sei denn, sie sind alle sehr breite Zeichenspalten. Bitte [bearbeiten], um die Spaltendefinitionen Ihrer Tabelle einzuschließen, also haben wir eine Vorstellung davon, wie groß ein * record * in Ihrer Tabelle ist. –

+0

Vielen Dank, mein Datensatz hat nur 2 Zeilen wie diese CodeArt (Varchar (15) NUmBL Integer). und ich lade von meinem Datensatz mit diesem Code. KBMTable1.LoadFromDataSet (IBQuery1, [mtcpoStructure]); – Touhami

Antwort

0

Ein aus dem Speicher kann aus verschiedenen Gründen geschehen:

  • Ihre Anwendung verwendet zu viel Speicher im Allgemeinen. Eine 32-Bit-Anwendung verfügt normalerweise nicht über genügend Arbeitsspeicher, wenn sie 1,4 GB mit dem FastMM-Speichermanager zugewiesen hat. Andere Speichermanager können schlechtere oder bessere Bereiche haben.
  • Speicherfragmentierung. Für eine einzelne große Zuordnung, die angefordert wird, ist möglicherweise nicht genügend Speicherplatz in Arbeitsspeicher. kbmMemTable versucht, ungefähr 200000 x 4 Bytes als eine einzige große Zuweisung zuzuweisen. Als seine größte Einzelzuteilung. Das sollte kein Problem sein.
  • Zu viele kleine Zuordnungen, die zu der obigen Speicherfragmentierung führen. Abhängig von der Einstellung der Performance-Eigenschaft wird kbmMemTable je Datensatz 1 bis n Speicherblöcke zuordnen. Wenn die Leistung auf schnell eingestellt ist, wird 1 Block zugewiesen (es sei denn, Blobs-Felder existieren, in diesem Fall wird eine zusätzliche Zuweisung für ein Nicht-Null-BLOB-Feld vorgenommen). Wenn die Leistung ausgeglichen oder klein ist, weist jedes Zeichenfolgenfeld einen anderen Speicherblock pro Datensatz zu.

freundlichen Grüßen Kim/C4D

+0

Vielen Dank Kim/C4D für Ihre Antwort, aber was kann ich tun, um dieses Problem zu lösen? – Touhami

Verwandte Themen