Перейти ошибка в ioutil.ReadFile () - PullRequest
       23

Перейти ошибка в ioutil.ReadFile ()

4 голосов
/ 07 февраля 2012

Я запускаю программу на Go, которая непрерывно отправляет данные после чтения файла /proc/stat. Использование ioutil.ReadFile("/proc/stat") После пробежки около 14 часов я получил ошибку: too many files open /proc/stat Нажмите здесь для фрагмента кода.

Я сомневаюсь, что отсрочка f.Close иногда игнорируется Go или пропускает ее.


Фрагмент кода (в случае, если play.golang.org умрет раньше, чем stackoverflow.com):

package main

import ("fmt";"io/ioutil")

func main() {
    for {
        fmt.Println("Hello, playground")
        fData,err := ioutil.ReadFile("/proc/stat")
        if err != nil {
            fmt.Println("Err is ",err)
        }   
        fmt.Println("FileData",string(fData))
    }
}

Ответы [ 2 ]

5 голосов
/ 07 февраля 2012

Возможно, причина в том, что где-то в вашей программе:

  • вы забыли закрыть файлы или

  • вы полагаетесь на сборщик мусора для автоматического закрытия файлов при завершении объекта, но консервативный сборщик мусора в Go не может этого сделать. В этом случае вы должны проверить потребление памяти вашей программой (неуклонно увеличивается ли оно во время работы программы).

В любом случае попробуйте проверить содержимое /proc/PID/fd, чтобы увидеть, увеличивается ли количество открытых файлов во время работы программы.

0 голосов
/ 14 июня 2014

Если вы уверены, что выполняете функцию f.Close (), у нее все еще есть проблема. Возможно, это связано с тем, что ваше другое подключение, например подключение к MYSQL, также будет причиной проблемы, особенно в цикле,и вы забыли закрыть соединение.

Всегда выполняйте:

db.connection....
**defer db.Close()**

If it is in loop

loop
    db.connection....
    **defer db.Close()**
end

Не помещайте соединение db.connection перед циклом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...