pandas "pandas.errors.ParserError: Ошибка токенизации данных. Ошибка C: неизвестная ошибка при обратном вызове ввода-вывода" - PullRequest
0 голосов
/ 11 октября 2019

Я использую pandas для read_csv текстового файла 3,8 Гб, с разделителем каналов, но при чтении файла в память возникают ошибки.

Вот полная ошибка, выданная моим read_in_files()функция:

Ошибка:

Reading in file C:\Users\cdabel\Desktop\_Temp\Master_Extract_Data_Mart_201909240935.txt
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
  File "<stdin>", line 7, in read_in_files
  File "c:\python36\lib\site-packages\pandas\io\parsers.py", line 685, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "c:\python36\lib\site-packages\pandas\io\parsers.py", line 463, in _read
    data = parser.read(nrows)
  File "c:\python36\lib\site-packages\pandas\io\parsers.py", line 1154, in read
    ret = self._engine.read(nrows)
  File "c:\python36\lib\site-packages\pandas\io\parsers.py", line 2048, in read
    data = self._reader.read(nrows)
  File "pandas\_libs\parsers.pyx", line 879, in pandas._libs.parsers.TextReader.read
  File "pandas\_libs\parsers.pyx", line 894, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas\_libs\parsers.pyx", line 948, in pandas._libs.parsers.TextReader._read_rows
  File "pandas\_libs\parsers.pyx", line 935, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 2130, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Unknown error in IO callback

Каковы возможные причины этой ошибки? Может ли это быть связано с памятью? Как я могу устранить это? Стоит ли разбивать эти данные на части?

Я не подозреваю о проблеме с ОЗУ, поскольку у меня более 7 ГБ неиспользуемой ОЗУ во время вызова функции, как видно из моего монитора производительности диспетчера задач Windows 10,Кроме того, я не могу предоставить примеры базовых данных, потому что это данные о работоспособности и PII.

Вот выдержка из моего кода:

import os
import pandas as pd

# File
filepath = "C:\\Temp\\datafile.txt"
filename_w_ext = "datafile.txt"

# Read in TXT file
def read_in_files(filepath, filename_w_ext):
    filename, file_ext = os.path.splitext(filename_w_ext)
    print('Reading in file {}'.format(filepath))
    with open(filepath, "r", newline='') as file:
        global df_data
        # Here's where it errors:
        df_data = pd.read_csv(file, dtype=str, sep='|')
        return df_data.columns.values.tolist(), df_data.values.tolist()

Поиск в Google только для этой конкретной ошибкидает исходный код для обработки ошибок в пандах код токенизатора

строки 583-612:

static int parser_buffer_bytes(parser_t *self, size_t nbytes) {
    int status;
    size_t bytes_read;

    status = 0;
    self->datapos = 0;
    self->data = self->cb_io(self->source, nbytes, &bytes_read, &status);
    TRACE((
        "parser_buffer_bytes self->cb_io: nbytes=%zu, datalen: %d, status=%d\n",
        nbytes, bytes_read, status));
    self->datalen = bytes_read;

    if (status != REACHED_EOF && self->data == NULL) {
        int64_t bufsize = 200;
        self->error_msg = (char *)malloc(bufsize);

        if (status == CALLING_READ_FAILED) {
            snprintf(self->error_msg, bufsize,
                     "Calling read(nbytes) on source failed. "
                     "Try engine='python'.");
        } else {
            snprintf(self->error_msg, bufsize, "Unknown error in IO callback");
        }
        return -1;
    }

    TRACE(("datalen: %d\n", self->datalen));

    return status;
}

1 Ответ

0 голосов
/ 15 октября 2019

После тестирования на более мощном сервере я теперь понимаю, что эта ошибка явно связана с тем, что для файла объемом 4 ГБ, содержащего 114 столбцов, требуется от 25 до 35 ГБ свободной оперативной памяти. На самом деле это должно привести к ошибке нехватки памяти, но я думаю, что увеличение объема памяти в ОЗУ превзошло способность кода Tokenizer проверить, насколько он близок к исчерпанию памяти.

...