Seite 2 von 2

Re: große Strings/Dateien in EditorGadget laden

Verfasst: 22.06.2017 21:57
von SBond
Klar :mrgreen: ...wenn es dir nicht zu viel Arbeit macht :wink:

Das Laden von großen Dateien erfolgt explizit durch den Nutzer und da dies nur im lokalen Netzwerk geschieht, ist es auch nicht ganz so tragisch mit der Größe. Das Laden der Datei, Parsen und Konvertieren schaffe ich bei den Datenmengen (20 MB) in weniger als einer Sekunde. So kann ich die Werte z.B. plotten. StringField ist aber extrem langsam (würde Minuten dauern), daher mache ich es etwas anders.

Ja das anschauen aller Eintäge wird ein Benutzer nur selten geschehen, aber z.B. bei Logdateien könnte es interessant werden. Da habe ich auch Exemplare die >60MB sind.

Das EditorGadget ist allgemein nicht dazu geeignet große Datenmengen darzustellen. Meine Überlegung war es nun, nur Ausschnitte der Datei im Editor darzustellen, je nach dem, wo sich z.B. der Scrollbalken befindet. ..so eine Art Seek-Funktion, die ab einen bestimmten Offset der String-Variable (in der sich der komplette Inhalt der Datei befindet) eine bestimmte Anzahl an Zeilen in den Editor lädt. ....quasi wie es z.B. ein Hex-Editor machen würde.

Bei PureBasic gibt es soweit ich weiß APIs, aber die gehen bei SpiderBasic nun nicht. ...mal sehen ob ich das irgendwie gelöst bekomme....

Re: große Strings/Dateien in EditorGadget laden

Verfasst: 24.06.2017 20:32
von Kiffi
SBond hat geschrieben:Klar :mrgreen: ...wenn es dir nicht zu viel Arbeit macht :wink:
die Herausforderung in diesem Fall war es, das dem ListIconGadget zugrunde liegende dGrid verwenden zu wollen, damit keine externen JavaScript-Libraries geladen werden müssen.

Das Laden und Darstellen der Daten geschieht meines Erachtens nun in akzeptablen Geschwindigkeiten, wobei ein Löwenanteil für die Aufbereitung der Daten verbraten wird. Vielleicht kann ein JS-Profi hier noch an der Tuning-Schraube drehen.

Demo mit Spiel-Daten: [Edit: Den Link gibt's auf Anfrage per PN]

Code:

Code: Alles auswählen

EnableExplicit

Enumeration
  #Window_Main
  #Gadget_Grid
EndEnumeration

Global T1

Procedure BlockUI(Message.s)
  ! $.blockUI({ message: v_message });
EndProcedure

Procedure UnblockUI()
  ! $.unblockUI();
EndProcedure

Procedure BindGridToGadget(Gadget, GridColumns, GridData)
  
  ! var selector = $(spider_GadgetID(v_gadget).div).find('.dijitContentPane');
  
  ! var grid = new spider.DGridOnDemandGrid({
  !   collection: v_griddata,
  !   columns: v_gridcolumns
  ! }, selector[0]);
  
  ! selector.data("grid", grid);
  
  ! grid.startup();
  
EndProcedure

! function csvToArray (csv) {
!    var rows = csv.split("\n");
!    return rows.map(function (row) {
!      return row.split("\t");
!    });
! };
! window.csvToArray = csvToArray;

Procedure HTTPRequestCallback(Success, Result.s)
  
  If Success
    
    Debug "Daten geladen in: " + Str(ElapsedMilliseconds() - T1) + " ms"
    
    T1 = ElapsedMilliseconds()
    
    ! var array = csvToArray(v_result);
    
    Debug "Csv -> Array: " + Str(ElapsedMilliseconds() - T1) + " ms"
    
    T1 = ElapsedMilliseconds()
    
    ! var records = [];
    
    ! $.each(array, function(rowCounter, row) {
    !   if (rowCounter == 0) {
    !   } else {
    !     var record = {};
    !     record.id = rowCounter;
    !     $.each(row, function(columnCounter, column) {
    !       record['col' + columnCounter.toString()] = column;
    !     });
    !     records.push(record);
    !   }
    ! });
    
    Protected Store
    
    ! v_store = new spider.DStoreMemory( {data : records, idProperty: 'id'} );
    
    Debug "Daten -> Store: " + Str(ElapsedMilliseconds() - T1) + " ms"
    
    Protected Columns 
    
    ! v_columns = {
    !   col0: 'Time [s]',
    !   col1: 'Offset [ms]',
    !   col2: 'Delay [ms]',
    !   col3: 'Dispersion [ms]',
    !   col4: 'Poll [Log2s]'
    ! };
    
    OpenWindow(#Window_Main, 0, 0, 600, 500, "dGrid", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ContainerGadget(#Gadget_Grid, 10, 10, 580, 480) : CloseGadgetList()
    
    T1 = ElapsedMilliseconds()
    
    BindGridToGadget(#Gadget_Grid, Columns, Store)
    
    Debug "Store -> Gadget: " + Str(ElapsedMilliseconds() - T1) + " ms"
    
  Else
    Debug "!HTTPRequest()"
  EndIf

  UnblockUI()
  
EndProcedure

BlockUI("<h1>20 MB Daten werden geladen...</h1>")

T1 = ElapsedMilliseconds()

HTTPRequest(#PB_HTTP_Get, "resources/bigdata.csv", "", @HTTPRequestCallback())
Schau es Dir mal an. Wenn Du Fragen hast: Melden!

Grüße ... Peter

Re: große Strings/Dateien in EditorGadget laden

Verfasst: 25.06.2017 14:54
von SBond
wow :mrgreen:

auf sowas wäre ich wohl nicht so schnell gekommen.
Habe tatsächlich noch 2 Fragen an dich: Was genau macht dieses "!" am Anfang der Zeile? Ermöglicht es einfach HTML/JavaScript oder ähnliches zu nutzen?

.. und in dieser Zeiel:

Code: Alles auswählen

! var array = csvToArray(v_result);
Wie wird hier v_result an Result.s gebunden? Wenn ich die Variablen umbennene geht es nicht mehr.


auf jeden Fall nochmals vielen Dank <)

Gruß,
Martin

Re: große Strings/Dateien in EditorGadget laden

Verfasst: 25.06.2017 22:58
von Kiffi
SBond hat geschrieben:Was genau macht dieses "!" am Anfang der Zeile? Ermöglicht es einfach HTML/JavaScript oder ähnliches zu nutzen?
es leitet eine Inline JavaScript - Zeile ein:
http://www.spiderbasic.com/documentatio ... nedjs.html

Grüße ... Peter

Re: große Strings/Dateien in EditorGadget laden

Verfasst: 25.06.2017 23:14
von SBond
oh :oops:

das habe ich wohl geschickt übersehen. Vielen Dank <)