ОШИБКА: не удалось обработать файл статистики "XX.csv": неизвестная ошибка

Я запускаю эту команду:

COPY XXX FROM 'D:/XXX.csv'  WITH (FORMAT CSV, HEADER TRUE, NULL 'NULL')

В Windows 7 он успешно импортирует файлы CSV размером менее 1 ГБ.

Если размер файла превышает 1 ГБ, я получаю "неизвестную ошибку".

[Code: 0, SQL State: XX000]  ERROR: could not stat file "'D:/XXX.csv'  Unknown error

Как я могу исправить эту проблему?

8 ответов

Вы можете обойти это, передав файл через программу. Например, я просто использовал это для копирования из файла размером 24 ГБ в Windows 10 и PostgreSQL 11.

copy t(c,d) from program 'cmd /c "type x:\path\to\file.txt"' with (format text);

Это копирует текстовый файл file.txt в стол t, столбцы c а также d,

Хитрость в том, чтобы бежать cmd в режиме одной команды, с /c и говорю это type из файла в вопросе.

https://github.com/MIT-LCP/mimic-code/issues/493 Комментарии пользователя alistairewj, 3 ноября 2018 г. • ► отредактировано

Хорошо, файл статистики CHARTEVENTS.csv не может быть обработан: неизвестная ошибка на самом деле является ошибкой в ​​PostgreSQL 11. Под капотом он вызывает fstat(), чтобы убедиться, что файл не является каталогом, и, к сожалению, fstat() 32-битная программа, которая не может обрабатывать большие файлы, такие как chartevents. Я протестировал сборку на Windows с PostgreSQL 10.5, и я не получил эту ошибку, так что я думаю, что она довольно новая.

Лучший обходной путь - сохранять файлы сжатыми (т.е. сохранять их как файлы.csv.gz) и использовать 7zip для загрузки данных непосредственно из сжатых файлов. В тестировании это, похоже, все еще работает. Здесь есть довольно подробное руководство о том, как это сделать: https://mimic.physionet.org/tutorials/install-mimic-locally-windows/

Краткая версия выше заключается в том, что вы сохраняете файлы.csv.gz, добавляете двоичный файл 7zip в путь среды Windows и затем вызываете файл postgres_load_data_7zip.sql для загрузки данных. Вы можете использовать файл postgres_checks.sql после всего, чтобы убедиться, что вы загрузили все данные правильно.

редактировать: для вашей более поздней ошибки, где вы используете этот подход 7zip, я не уверен, почему он не загружается. Попробуйте перегрузить только файл ADMISSIONS.csv.gz и посмотреть, не выдаст ли он ту же ошибку. Может быть, есть новая версия 7zip, которая требует от меня обновить скрипт или что-то еще!

Для любого другого, кто погуглил это сообщение об ошибке Postgres после попытки работать с файлом>1 ГБ в Postgres 11, я могу подтвердить, что ответ @亚军 above выше точен. Это действительно проблема размера.

Однако я попробовал другой подход, чем @ than 吴 и @Loren's: я просто удалил Postgres 11 и установил стабильную версию Postgres 10.7. (Кстати, на Windows 10, если это имеет значение.)

Я повторно запустил исходный код, который вызвал ошибку, и через несколько минут я заполнил новую таблицу данными из CSV-файла среднего размера (~3 ГБ). Первоначально я пытался использовать CSVSplitter для @Loren, который работал нормально, пока у меня не было почти свободного места на моей машине. (Спасибо, Battlefield 5.)

В моем случае в PGSQL 11 нет ничего такого, на что я бы рассчитывал, чего не было в версии 10.7, поэтому я думаю, что это может быть хорошим решением для всех, кто сталкивается с этой проблемой. Спасибо всем выше за вклад, особенно в ОП за публикацию этого в первую очередь. Я вылечил огромную, огромную головную боль!

Это было исправлено в фиксации bed90759f в PostgreSQL v14.

Фактический предел файла для ошибки составляет 4 ГБ.

Исправление было слишком инвазивным, чтобы его можно было перенести обратно, поэтому вы можете выполнить обновление только во избежание проблемы. После того, как исправление прошло полевые испытания, вы можете пролоббировать список рассылки pgsql-hackers, чтобы получить его обратно.

Похоже, это проблема не с базой данных, а с psql / pgadmin. Обходной путь заключается в использовании программного обеспечения администратора из предыдущих версий psql:

  1. Использовать существующую базу данных PostgreSQL 11
  2. Установите psql или pgadmin из установки PostgreSQL 10 и используйте его для загрузки файла (с помощью команды, указанной в вопросе)

Надеюсь, это поможет любому, кто столкнется с той же проблемой.

С pgAdmin и AWS я использовал CSVSplitter для разделения на файлы размером менее 1 ГБ. Хромой, но работал. Импорт pgAdmin добавляется к существующей таблице. (Изменен управляющий символ с "на", чтобы избежать ошибки из-за не заключенного в кавычки текста в исходном файле. Обычно я применяю кавычки в LibreOffice, но эти файлы были слишком большими, чтобы их открыть.)

Добавьте две строки в ваш CSV-файл: одну в начале и одну в конце:

КОПИРОВАТЬ XXX ИЗ СТАНДАРТНОГО ДАННОГО С ПОМОЩЬЮ (FORMAT CSV, HEADER TRUE, NULL 'NULL');
< вот строки, которые уже содержатся в вашем файле >
\.

Не забывайте еще одну новую строку после \. линия. Затем вызовите
psql -h hostname -d dbname -U username -f 'D:/XXX.csv'

Вот что у меня сработало: \COPY member_data.lab_result FROM PROGRAM 'gzip -dcf lab_result.dat.gz' WITH (FORMAT 'csv', DELIMITER '|', QUOTE '`')

Другие вопросы по тегам