Форум программистов, компьютерный форум, киберфорум
Node.js
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
272 / 176 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
1

Error: EMFILE: too many open files, open

27.02.2018, 17:40. Показов 4877. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, подскажите плииз!

Поймал ошибку "Error: EMFILE: too many open files, open"
Чем это может грозить и как с этим бороться?
Кто-нибудь с этим сталкивался?
Это чисто-виндовая или в Линуксе тоже бывает? (мне тяжело в Линуксе проверить)

Написал утилиту - "генератор картинок". В цикле генерирует 15625 картинок

Не по теме:

(комбинаторикой - "6 лампочек по 5 цветов в каждой" ~ 2.9Mb).


Использовал canvas. Примерно это выглядит так:
Javascript
1
2
3
4
var canvas = new Canvas(WW, HH, 'png');
var ctx = canvas.getContext('2d');
//...рисую
canvas.pngStream().pipe(fs.createWriteStream(fileName));
Выполняю это в в цикле меняя картинку и имя файла и... ловлю ошибку!
причем цикл "успешно закончен" за секунду и "заканчивает запись потоков". и только потом ошибка!

Если ограничиваю количество до 8000 все работает! (уточнять максимальную цифру не стал)

Не по теме:

..."временно" создал их по 8000 (0...8000, 8000...16000, ...) но если все сразу пытаюсь...



Планирую написать "генератор картинок" и она планируется быть ВЫСОКОНАГРУЖЕННОЙ! Картинки маленькие и могут запрашиваться тысячами - не хочу на 1001м запросе поймать ошибку!

погуглил... похоже ошибка частая, а решения не нашел!
вот один из примеров (у меня тоже вызывает ошибку) взял с https://github.com/nodejs/node/issues/4386
Javascript
1
2
3
4
5
6
7
8
const fs = require('fs');
fs.mkdirSync('testfiles');
let x;
for (x = 0; x < 26000; x++) { // по ссылке цифра меньше, возможно зависит от версии OS
  fs.open('testfiles/' + x, 'w', function(err, fd) {
    if (err) console.log(err.toString());
  });
}
Добавлено через 1 час 53 минуты
вопрос вроде решился...

Javascript
1
2
3
4
//вместо
const fs = require('fs');
//использовал
var fs = require('graceful-fs');
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2018, 17:40
Ответы с готовыми решениями:

[ILINK32 Error] Fatal: Could not open .\Debug\Win32\Variant_1.ilf (project already open in IDE?)
Fatal: Could not open .\Debug\Win32\Variant_1.ilf (project already open in IDE?) на русском ...

exception class edbengineerror with message too many open files
Добрый день! Возникла проблема, прошу помощи в её решении. В проекте порядка 30 форм, создал еще...

[ILINK32 Error] Error: Unable to open file 'TEERESOU.RES'
Ошибка возникает, когда снимаю галочку &quot;Link with runtime packages&quot;. А по-иному никак не запустить...

Linker Fatal Error: Could not open *.exe (error code 5)
помогите отладить программу выдает ошибку: Fatal: Could not open C:\Program Files...

7
28 / 22 / 15
Регистрация: 29.11.2017
Сообщений: 75
27.02.2018, 21:33 2
Можно создавать несколько процессов с потоками.

Покопался в исходниках модуля graceful-fs, и заметил, что он при ошибке EMFILE, ставит файл в очередь и ждет, пока закроется предыдущий файл
1
Всегда онлайн
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
28.02.2018, 19:45 3
andyj, эта ошибка выскакивает, как вы уже поняли, когда открыто очень много файлов в процессе. Это ограничение установлено самой ОС.

Цитата Сообщение от andyj Посмотреть сообщение
Это чисто-виндовая или в Линуксе тоже бывает? (мне тяжело в Линуксе проверить)
И там и там. EMFILЕ вообще линуксовый код ошибки, но node.js использует их для "кросс-платформенности".

Каждый файл после окончания работы с ним нужно закрывать.
0
272 / 176 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
28.02.2018, 21:26  [ТС] 4
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
Каждый файл после окончания работы с ним нужно закрывать.
Похоже они сами закрываются! Я лишь вызываю промисы/требования (еще в терминах слегка плаваю) на запись потока!
Javascript
1
canvas.pngStream().pipe(fs.createWriteStream(fileName));
10тыс штук! Где здесь надо "закрывать" файлы?
...я ожидал что они просто становятся в "очередь". А в fs они почему-то запускаются параллельно ВСЕ СРАЗУ, без учета максимально-возможного количества открытых файлов в ОС! В Win7 Вылетает на 10тыс, но работает на 8тыс.
0
Всегда онлайн
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
01.03.2018, 00:06 5
andyj,

Javascript
1
2
3
var stream = fs.createWriteStream(fileName);
canvas.pngStream().pipe(stream);
stream.end();
0
272 / 176 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
01.03.2018, 05:47  [ТС] 6
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
stream.end();
...после этого мгновенно и без ошибок создал 24500 ПУСТЫХ файлов! подозреваю что поток закрывается прежде чем до него доходит очередь на запись картинки!
Пока что лучшее решение - использование var fs = require('graceful-fs'); вместо fs! Не знаете, у него есть какие-нибудь "побочные эффекты" по сравнению с "системным" fs?
0
1 / 1 / 2
Регистрация: 28.07.2009
Сообщений: 57
17.01.2019, 04:12 7
Меня очень мучает эта проблема, ошибка "Error: EMFILE: too many open files, open" возникает слишком часто, хотя в моем коде происходит всего-то запись в 3 файла раз в 3 минуты.

Наибольшая проблема с записью массива userData. Если происходит ошибка, файл становится пустым. Если закрыть после неудачной записи программу, приходится восстанавливать не пустой файл из резервных.

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

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
setInterval(() => {
 
    // 1. Сравнить данные пользователей с прошлыми данными
    // 2. Записать, если данные изменились или прошлых данных нет
    // 3. Синхронизировать прошлые данные, если запись прошла успешно
    if (JSON.stringify(userData) != JSON.stringify(oldUserData)) {
        fs.writeFile("./Ellesime/UserData.json", JSON.stringify(userData), (ERR) => {
            if (!ERR) {
                oldUserData = JSON.parse(JSON.stringify(userData));
            } else {
                console.log(currentTime() + " [   DEBUG   ] [     SAVE DATA     ] An error occurred while writing UserData: " + ERR);
            }
        });
    }
 
    // Запись сделок в файл
    if (tradeLog) {
        fs.appendFile("./Ellesime/TradeLogs.txt", tradeLog, (ERR) => {
            if (!ERR) {
                tradeLog = "";
            } else {
                console.log(currentTime() + " [   DEBUG   ] [     SAVE DATA     ] An error occurred while writing TradeLogs: " + ERR);
            }
        });
    }
 
    // Запись сообщений в файл
    if (chatLog) {
        fs.appendFile("./Ellesime/ChatLogs.txt", chatLog, (ERR) => {
            if (!ERR) {
                chatLog = "";
            } else {
                console.log(currentTime() + " [   DEBUG   ] [     SAVE DATA     ] An error occurred while writing ChatLogs: " + ERR);
            }
        });
    }
}, 1000 * 60 * 3); // Раз в три минуты
0
272 / 176 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
17.01.2019, 11:17  [ТС] 8
Цитата Сообщение от FiJer Посмотреть сообщение
Я уже перерыл десятки тем по поиску решения этой проблемы, но так ничего и не вышло.
В свое время решил эту проблему установкой пакета graceful-fs (чуть выше было решение).
Javascript
1
2
3
4
//вместо
const fs = require('fs');
//использовал
var fs = require('graceful-fs');
0
17.01.2019, 11:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2019, 11:17
Помогаю со студенческими работами здесь

Ошибка при открытии формы "the wrong parameters were passed to the converter. To convert files, open them from the file menu."
Здравствуйте! Подскажите пожалуйста. У меня есть форма, на ней грид. Все работало нормально....

error 105: file not open for output
error 105: file not open for output!просветите меня тупого что это значит!

Error: Unable to open include file
Доброе время суток, недавно захотел попробовать писать программы под DOS, для этого установил себе...

Error FIRST.CPP 1 11: Cannot open file: iostream.h
При комплиировании выходит ошибка Borland Resourse Compiler Version 5.40 Copyright &lt;c&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru