2012-03-26 2 views
4

Ich verwende RMySQL, um einige Zeilen aus einer Datentabelle zu holen (die Tabelle ist groß, also kann ich sie hier nicht posten, aber enthält im Grunde eine Menge Zahlen) .. insgesamt 10 Spalten und etwa 12.000 Zeilen). Ich bekomme den folgenden Fehler, wenn ich fetch(con, n=-1) ausführen: RS-DBI driver warning: (error while fetching rows) und der Server gibt nur 1713 Zeilen zurück.RMySQL, Fetch-Fehler - RS-DBI-Treiber Warnung: (Fehler beim Abrufen von Zeilen)

Wenn ich einige der Spalten, die abgerufen werden, loswerden, scheint dies gut zu funktionieren. Weiß jemand, woran das liegen kann? Ich weiß nicht einmal, wo ich mit dem Debuggen anfangen soll. Könnte dies eine serverseitige Einstellung sein? Meine R-Session hat mehr als genug Speicher (20 Gigs).

Antwort

1

Ist jede Spalte eine Zahl oder eine Liste von Zahlen? Das heißt, wie viele Bytes sind in jeder Spalte?

Ich habe dieses Problem schon einmal kennengelernt, und als ich es getroffen habe, lag es daran, dass ich zu viele Daten zu schnell ziehen wollte. Ich habe festgestellt, dass in diesen Fällen manchmal mehrere Anrufe mit kleineren Werten von n funktionieren. Dann wieder, die Zeilen in den Datenbanken, mit denen ich Probleme hatte, waren riesig

+0

wird dies versuchen! – Alex

1

Eine bessere Auflösung ist statt n = -1 versuchen, eine sehr große Zahl wie n = 1000000. Der Fehler kam nicht, ich benutzte das. In meinem Fall ist die Anzahl der abgerufenen Zeilen I betrug 1,13 Millionen

1

Ich habe die gleiche Art von Problemen:

  1. Fetch alle Zeilen einmal:

    df = dbFetch(res, n = -1)

    => es nur zurückgegeben ein Teil des Resultsets, und höre auf, mehr Zeilen zu holen.

  2. eine Schleife von Chunks zu holen:

     
    while (!dbHasCompleted(res)) { 
        chunk = dbFetch(res, n = 1000) 
        print(nrow(chunk)) 
        df = rbind(df, chunk) 
    } 
    

    => es zurückgegeben einige Stücke eine Weile und läuft dann in eine Endlosschleife von Null großen Brocken („[1] 0“ für immer gedruckt wird), auch wenn Das Resultset hat nicht alle Zeilen abgerufen: dbHasCompleted(res) == FALSE.

Dann habe ich diese Strategie:

Führen Sie eine Abfrage mit „select count(1) from table where ...“ die Größe der Ergebnismenge zu fangen. 1 zu der Zeilenanzahl [row_count = as.integer(dbFetch(res, n = 1)) + 1] hinzugefügt und diesen "count + 1" als Parameter n verwendet, um alle Zeilen gleichzeitig in der nächsten Abfrage abzurufen. Dies scheint OK bis jetzt zu sein ... aber dann wusste ich über diese Form:

my_df = dbGetQuery(con, my_query)

viel bessere Methode, keine Fehler noch nicht gefunden.