![]() |
|
Почему 1С не использует FILE_FLAG_DELETE_ON_CLOSE для временных файлов | ☑ | ||
---|---|---|---|---|
0
MM
21.02.14
✎
11:52
|
При работе с временными файлами 1С использует флаг FILE_ATTRIBUTE_TEMPORARY в функции CreateFile, но не использует FILE_FLAG_DELETE_ON_CLOSE. Не смотря, на рекомендации http://msdn.microsoft.com/en-us/library/cc500400.aspx, которые могли бы улучшить скорость работы с кешами. Знает ли кто почему?
|
|||
1
Золотник
21.02.14
✎
11:53
|
В 1с программисты умнее, чем в какой то мелкомягкой шарашке.
|
|||
2
Asmody
21.02.14
✎
11:53
|
(0) на Селезнёвской был, спрашивал?
|
|||
3
MM
21.02.14
✎
11:55
|
(2) Я вначале сюда. )
Думаю стоит ли исправлять внешней компонентой? |
|||
4
Speshuric
21.02.14
✎
13:04
|
(3) А как это исправить внешней компонентой? Ну, ок, оказались мы даже внутри процесса 1С (клиент или сервер, кстати?). Как найти все открытые файлы и поменять режим открытия? Как различить из временных файлов не будут закрываться-открываться, а будут только закрываться? Как будет отрабатывать команда удаления, если она применялась (некоторые файлы точно видел, потом удаляются тем же сеансом)?
Надо, кстати, попробовать померять/сравнить применительно к 1С виндовое поведение и tempfs линуха. |
|||
5
MM
21.02.14
✎
14:57
|
Сплайсингом API для core82.dll или лучше изменением таблиц импорта. Пока смотрел клиент, но длл похоже общая.
Что делать с временными файлами, которые повторно открываются ничего предложить не могу. Возможно, что 1С правильно обрабатывает ошибку удаления файла которого нет. По-крайней мере, 1С свои временные файлы вначале пытается открыть с усечением, и при ошибке создаёт новый. |
|||
6
Torquader
21.02.14
✎
15:00
|
На самом деле, если в файле предполагается что-то сохранить, то DELETE_ON_CLOSE тут ни к месту, так как закрыв дескриптор, мы просто теряем файл.
Кроме того, не факт, что такой файл увидят другие процессы или потоки по имени (им придётся передавать через CopyHanlde). С другой стороны - зачем вообще нужны временные файлы, которые после закрытия сразу удаляются - только для расширения памяти - а тогда файл может быть всего один, а не "загадить всё что можно". |
|||
7
MM
21.02.14
✎
15:27
|
(6) если данные маленькие или ОЗУ много, то всё добро хранится в памяти, это обычно так, если глядеть на tmp-файлы. Если же надо обработать, что-то большое, такой унифицированный подход позволяет занимать хоть весь винчестер.
Когда данные планируется сохранить на диск, то устанавливать FILE_ATTRIBUTE_TEMPORARY тоже не стоит. |
|||
8
Speshuric
21.02.14
✎
15:37
|
(5) то есть подмена dll, а не внешняя компонента?
|
|||
9
MM
21.02.14
✎
15:40
|
(8) Нет, сплайсинг использует компонента Romixa. Но он не потокобезопасен.
|
|||
10
MM
25.02.14
✎
18:53
|
Никто не знает?
|
|||
11
Torquader
25.02.14
✎
23:54
|
В документации ещё написано, что открыть ещё раз файл с флагом DELETE_ON_CLOSE можно только если установлен режим FILE_SHARE_DELETE, что предполагает удаление файла в процессе работы.
P.S. проще чистить директорию временных файлов после закрытия 1С. |
|||
12
MM
26.02.14
✎
11:43
|
(11) Эти флаги FILE_ATTRIBUTE_TEMPORARY и DELETE_ON_CLOSE на пару, подсказывают, что данные файла надо записывать на диск в последнюю очередь, что разгрузит винчестер.
FILE_SHARE_DELETE вроде нужен, если планируется повторное открытие файла, но можно воспользоваться DuplicateHandle, если это потребуется. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |