2014-02-07 5 views
3

Проход в документации file бросилось в глаза:Что именно Anonymous Файлы

## We can do the same thing with an anonymous file. 
Tfile <- file() 
cat("abc\ndef\n", file = Tfile) 
readLines(Tfile) 
close(Tfile) 

Что же такое этот анонимный файл? Он существует на диске или только в памяти? Меня это интересует, поскольку я рассматриваю программу, которая потенциально может потребоваться для создания/удаления тысяч временных файлов, и если это произойдет только в памяти, похоже, что это будет иметь меньшее влияние на системные ресурсы.

Это linux SO Q похоже, что этот файл может быть настоящим файлом на диске, но я не уверен, насколько он подходит для данного конкретного примера. Кроме того, this big memory doc кажется, намекает на хранении на основе реального диска (хотя я предполагаю, основанный анонимный файл file используется):

Следует также отметить, что пользователь может создать «анонимный» File- подкрепленную big.matrix, указав «» как аргумент отказа. В этом случае резервная копия находится во временном каталоге, и файл дескриптора не создается. Их следует использовать с осторожностью, поскольку даже анонимные базы используют дисковое пространство, которое может в конечном итоге заполнить жесткий диск. Анонимные резервные копии удаляются либо вручную, либо пользователем, либо автоматически, когда операционная система считает это уместным.

В качестве альтернативы, если textConnection подходит для использования для данного типа приложения (открыть/закрыть сотни/тысячи раз), и только память, что бы удовлетворить мои потребности. Я планировал это делать до тех пор, пока я не прочитал примечание в документации этой функции:

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

+0

вы можете попробовать написать тонны данных и контролировать свои ресурсы (DISK vs RAM), чтобы узнать ... – flodel

+0

@flodel, если я не могу найти ссылку, я попробую, хотя я бы обеспокоен возможностью различных реализаций на разных ОС. В идеале я предпочел бы полагаться на задокументированное поведение. – BrodieG

+0

Анонимный файл - это всего лишь временный файл без дескриптора (вроде заголовка). Поэтому я думаю, что это зависит от вашей ОС, вы должны внимательно прочитать, что такое «временный файл» и как/где он хранится. – agstudy

ответ

5

Мой C очень ржавый, так что надеюсь, более опытные люди могут исправить меня, но я думаю, что ответ на ваш вопрос «Что именно это анонимный файл? Существует ли он на диске, или только в памяти?» is «Он существует на диске».

Вот что происходит на уровне C (я смотрю на исходный код на http://cran.r-project.org/src/base/R-3/R-3.0.2.tar.gz):

A. Функция file_open, определенной в src/main/connections.c:554, имеет следующую логику, связанные с анонимным файлом (с пустым описанием), строки 565-568:

if(strlen(con->description) == 0) { 
    temp = TRUE; 
    name = R_tmpnam("Rf", R_TempDir); 
} else name = R_ExpandFileName(con->description); 

Так новое временное имя файла генерируется, если имя файла не было поставлено file.

B. Если имя файла не равно stdin, то вызов R_fopen(name, con->mode) происходит в строке 585 (есть некоторые тонкости с именами Win32 и UTF8, но мы можем их игнорировать).

C. Наконец, файл name является несвязанным в строке 607. документации unlink говорит:

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

Таким образом, запись в каталоге удаляется, но файл существует до тех пор, пока он открыт процессом R.

D. Наконец, R_fopen определен в src/main/sysutils.c:135 и просто вызывает fopen внутренне.

+0

Это, похоже, соответствует тому, что упоминал Мэттью в комментариях. Спасибо за то, что вы делаете ногу. – BrodieG

+2

Что касается памяти или на диске, это зависит от того, где живут ваши временные файлы. Многие системы linux помещают '/ tmp' в память. Windows не работает. –

+0

@MatthewLundberg И нет никакой гарантии, что в памяти будет быстрее в R - 'textConnection()' заведомо медленны – hadley

Смежные вопросы