RMySQL, ошибки выборки - предупреждение драйвера RS-DBI: (ошибка при выборке строк) - PullRequest
4 голосов
/ 26 марта 2012

Я использую RMySQL для извлечения некоторых строк из таблицы данных (таблица большая, поэтому я не могу разместить ее здесь, но в основном она содержит несколько чисел ... всего 10 столбцов и около 12 000 строк). Я получаю следующую ошибку при запуске fetch(con, n=-1): RS-DBI driver warning: (error while fetching rows) и сервер возвращает только 1713 строк.

Если я избавлюсь от некоторых извлекаемых столбцов, то это, похоже, будет работать нормально. Кто-нибудь знает, с чем это может быть связано? Я даже не знаю, с чего начать отладку. Может ли это быть настройка на стороне сервера? Моя R сессия имеет более чем достаточно памяти (20 гигов).

Ответы [ 3 ]

2 голосов
/ 27 февраля 2013

Является ли каждый столбец числом или списком чисел?То есть, сколько байтов в каждом столбце?

Я сталкивался с этой проблемой раньше, и когда я столкнулся с ней, это было потому, что я пытался извлечь слишком много данных слишком быстро.Я обнаружил, что в этих случаях может сработать несколько вызовов с меньшими значениями n.Опять же, строки в базах данных, с которыми у меня были проблемы, были огромными

1 голос
/ 05 сентября 2016

У меня проблемы такого же типа:

  1. Получить все строки один раз:

    df = dbFetch(res, n = -1)

    => он вернул только часть набора результатов и прекратил извлекать больше строк.

  2. Использование цикла для выборки по кускам:

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

    => некоторое время он возвращал некоторые чанки, а затем запускает бесконечный цикл чанка нулевого размера (печатает «[1] 0» навсегда), даже когда набор результатов не завершен для извлечения всех строк: dbHasCompleted(res) == FALSE.

Затем я использовал эту стратегию:

Запустите запрос с "select count(1) from table where ...", чтобы узнать размер результирующего набора. Добавлен 1 к числу счетчиков строк [row_count = as.integer(dbFetch(res, n = 1)) + 1] и используйте это «count + 1» в качестве параметра n, чтобы получить все строки сразу в следующем запросе. Кажется, до сих пор это было нормально ... но я знал об этой форме:

my_df = dbGetQuery(con, my_query)

Гораздо лучший метод, ошибок пока не найдено.

1 голос
/ 06 августа 2014

Лучшее мнение вместо n = -1, попробуйте поставить очень большое число, например, n = 1000000.Ошибка не пришла, когда я использовал это.В моем случае количество выбранных строк составило 1,13 миллиона

.
...