Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Ищу алгоритм удаления

3445  1 2 3 4 5 6 все
Murr патриот27.01.24 23:38
Murr
NEW 27.01.24 23:38 
в ответ AlexNek 27.01.24 23:28

Ну вот создал я файл, сколько резервировать?

------

размер диска/квоты делишь на размер выбранного блока => получаешь возможное количество блоков

смотришь сколько байт нужно чтобы поместился номер последнего блока

резервируешь: количество блоков * количество байт для номера


И, кстати, будет не вредно сразу прописать весь файлик мусором - чтоб место физически выделилось.

#41 
Murr патриот27.01.24 23:41
Murr
NEW 27.01.24 23:41 
в ответ AlexNek 27.01.24 23:29

Один размер для 4 байт и 1000?

------

именно так.

для 4 байт один блок

для 1000 - 1 или 2 или 4 - по размеру блока

#42 
Murr патриот27.01.24 23:46
Murr
NEW 27.01.24 23:46 
в ответ AlexNek 27.01.24 23:36

Читай доки на FAT.

----------

Мне то зачем? Я и так знаю.


При побайтвом мапинге будет другая проблема - фрагментированность - единственный записанный байт залочит всю систему.

#43 
uscheswoi_82 коренной житель27.01.24 23:47
NEW 27.01.24 23:47 
в ответ AlexNek 27.01.24 12:18

1. Все полезные алгоритмы нужно хранить на флешки/CD/внешнем диске.

2. Даже Microsoft не смогла сделать толком нормальную утилиту по дефрагментации диска, она купила её помойму у Symantec. Когда удаляются файлы, там помечается каким-то флагом что файл удалён, и при этом остаются дырки, а при дефрагметации диска пустые места (дырки) заполняются данными. Дефрагментация это долгий процесс.

3. В файловой системе блоки (сектора) фиксировоной длины, помойму 1 блок (сектор) = 512 байт.

4. Не понял задачу, но как-то так:

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
// Копирует блок в общую память
void copy_block(char *buf, char *data, int pos) {
    memcpy(buf+pos, data, strlen(data));
}
// Удаляет блок из общей памяти
void delete_block(char *buf, int pos, int len) {
    memset(buf+pos, '\0', len);
}
int main(int argc, char** argv) {
    char *buf; // Общая память
    char block1[] = "Hello "; // блок содержащий слово Hello
    char block2[] = "Igor"; // блок содержащий слово Igor
    char block3[] = "Ann";// блок содержащий слово Ann
    buf = (char *)malloc(65535); // Резервируем память 65К
    memset(buf, '\0', 65535); // Инициализируем память
    copy_block(buf, block1, 0); // Копируем в 0 ячейку памяти Hello
    copy_block(buf, block2, strlen(block1)); // Копируем в 5 ячейку памяти Igor
    cout << buf << endl; // Выводим на экран Hello Igor
    delete_block(buf, strlen(block1), strlen(block2)); // Удаляем в 5 ячейки памяти 3 байта
    cout << buf << endl; // Выводим на экран Hello
    copy_block(buf, block3, strlen(block1));// Копируем в 5 ячейку памяти Ann
    cout << buf << endl; // Выводим на экран Hello Ann
    free(buf); // Освобождаем зарервированную память
    return 0;
}


А с блоками можно сделать примерно так:

    struct BLOCK_1 {
        long next_offset;
        char buf[5];
    };

    struct BLOCK_2 {
        long next_offset;
        char buf[10];
    };

    struct BLOCK_3 {
        long next_offset;
        char buf[15];
    };
        
    BLOCK_1 block_1;
    BLOCK_2 block_2;
    BLOCK_3 block_3;
    
    block_1.next_offset = 5;
    strcpy(block_1.buf, "Igor");
    block_2.next_offset = 5 + 10;
    strcpy(block_2.buf, "Ann");
    block_3.next_offset = 5 + 10 + 15;
    strcpy(block_3.buf, "Mustermann");

P.S.:Извиняюсь если ответил не так, что-то последние три дня плохо соображаю, две ночи плохо спал.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Моя ФЛ Он и Она
#44 
AlexNek патриот27.01.24 23:51
AlexNek
NEW 27.01.24 23:51 
в ответ Murr 27.01.24 23:41
Один размер для 4 байт и 1000?------именно так.
Спасибо но не надо, решение было очень красивым, поэтому и понравилось
#45 
AlexNek патриот27.01.24 23:52
AlexNek
NEW 27.01.24 23:52 
в ответ Murr 27.01.24 23:46
Мне то зачем? Я и так знаю.

Исправил, это была "ссылка" на твой запрос

#46 
AlexNek патриот27.01.24 23:58
AlexNek
NEW 27.01.24 23:58 
в ответ uscheswoi_82 27.01.24 23:47
buf = (char *)malloc(65535); // Резервируем память 65К

Это сразу не годится


Структура записи должна быть типа такой, хотя ссылка на следующий блок совершенно не нужна

struct BLOCK {
        long next_offset;
        char buf[];
    };
#47 
AlexNek патриот28.01.24 00:00
AlexNek
NEW 28.01.24 00:00 
в ответ uscheswoi_82 27.01.24 23:47, Последний раз изменено 28.01.24 18:05 (AlexNek)
Все полезные алгоритмы нужно хранить на флешки/CD/внешнем диске.

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

#48 
Murr патриот28.01.24 00:01
Murr
NEW 28.01.24 00:01 
в ответ AlexNek 27.01.24 23:28

получаю 10т.+1 описаний дырок.

------

Просто затираешь в таблице блоков освободившиеся блоки.

В том числе и блоки под папкой.

Единственный неудаляемый блок - корневой

#49 
Murr патриот28.01.24 00:06
Murr
NEW 28.01.24 00:06 
в ответ AlexNek 27.01.24 23:51
решение было очень красивым

-----------------

Значит вопрос фрагментации не решался.

#50 
alex445 коренной житель28.01.24 01:48
NEW 28.01.24 01:48 
в ответ uscheswoi_82 27.01.24 23:47, Последний раз изменено 28.01.24 01:52 (alex445)
Когда удаляются файлы, там помечается каким-то флагом что файл удалён, и при этом остаются дырки, а при дефрагметации диска пустые места (дырки) заполняются данными.

А зачем физически удалять данные, если достаточно пометить их как свободные для перезаписи?

Дефрагментация это долгий процесс.

Вместо вредной и медленной дефрагментации лучше скопировать всё на другой пустой диск, а потом на первом всё удалить. Теперь можно при необходимости повторить процесс, но в обратном направлении.


Чтобы фрагментация меньше доставляла проблем, нужно придерживаться примерно такого же правила, как для RAM - память должна использовать не более, чем на 2/3 от доступной. В идеале не более, чем на половину. Если используется больше, нужно докупить памяти. Оперативка, кстати, тоже страдает от фрагментации, хотя и в меньшей степени из-за своей скорости. Но ещё она страдает вдобавок и от свопа.

#51 
AlexNek патриот28.01.24 12:05
AlexNek
NEW 28.01.24 12:05 
в ответ Murr 28.01.24 00:01, Последний раз изменено 28.01.24 12:05 (AlexNek)
Просто затираешь в таблице блоков освободившиеся блоки.

А как это повлияет на размер файла? Или как я туда смогу что то записать из данных?

#52 
AlexNek патриот28.01.24 12:12
AlexNek
NEW 28.01.24 12:12 
в ответ Murr 28.01.24 00:06
Значит вопрос фрагментации не решался.

Всё отлично решалось. И блоки были, только не фиксированной длины, а просто кратные степени 2ки.

Но пока ничего не навеяло на путь решения. Уже на этапе удаления блока, два соседних удалённых блока объединялись и в таблицу удаленных записывался только этот объединённый блок.

#53 
Murr патриот28.01.24 17:10
Murr
NEW 28.01.24 17:10 
в ответ AlexNek 28.01.24 12:05

А как это повлияет на размер файла?

-------

А должно?


Или как я туда смогу что то записать из данных?

------

Находишь в таблице блоков пустой (000) блок и пишешь туда. Что не вошло - пишешь в следующий пустой.

Там навигация по блокам совершено элементарная - по положению описателя блока сразу получаешь смещение в файле, а описатель содержит номер следующего используемого блока.

#54 
Murr патриот28.01.24 17:18
Murr
NEW 28.01.24 17:18 
в ответ AlexNek 28.01.24 12:12

не фиксированной длины, а просто кратные степени 2ки.

------

голову примени - либо фрагментация, либо фиксированный размер блока. Другого просто нет. Даже не комбинируется.

У винды, кстати, память управляется блоками фиксированной длины и под это дело уходит хренова куча памяти.

#55 
Murr патриот28.01.24 17:27
Murr
NEW 28.01.24 17:27 
в ответ AlexNek 28.01.24 12:12

два соседних удалённых блока объединялись

-----

У тебя квота Х.

Ты пишешь последовательно (Х/2-2), (4). (Х/2-2) - полный.

Освобождаешь оба (Х/2-2).

Теперь тебе надо писать ровно (Х/2) - все, приплыли.

Если не приплыли, то как-то без блоков переменой длины.

#56 
AlexNek патриот28.01.24 18:09
AlexNek
NEW 28.01.24 18:09 
в ответ Murr 28.01.24 17:10
А как это повлияет на размер файла?-------А должно?

конечно, зачем мне лишний мусор в файле


Находишь в таблице блоков пустой

Речь как то и идет о таблице пустых блоков мне нужно утилизовать записи которые уже не используются.


Что не вошло - пишешь в следующий пустой

Концепт другой, блок заполняется полностью.

#57 
AlexNek патриот28.01.24 18:12
AlexNek
NEW 28.01.24 18:12 
в ответ Murr 28.01.24 17:18
либо фрагментация, либо фиксированный размер блока. Другого просто нет

Ага, конечно нет. Когда сам же и делал. И речь о 100% дефрагментации не идёт.

#58 
AlexNek патриот28.01.24 18:15
AlexNek
NEW 28.01.24 18:15 
в ответ Murr 28.01.24 17:27
Теперь тебе надо писать ровно (Х/2) - все, приплыли.

Мысля у вас какая то странная.

вот один свободный блок на 16 байт, вот рядышком еще один на 16. Объединяем и получаем блок на 32 байта.

Где проблема, то?

#59 
Murr патриот28.01.24 19:13
Murr
NEW 28.01.24 19:13 
в ответ AlexNek 28.01.24 18:09

зачем мне лишний мусор в файле

------

Чтобы повех него писать новую инфу.

Или т при удалении файла прописываешь занимаемое им место поперемено 0/1?


о таблице пустых блоков

------

А нету такой. За ненадобностью.


мне нужно утилизовать записи

-----

Ну так объявляешь блоки свободными и все.


Концепт другой,

------

Выше написано во что упрешься.

#60 
1 2 3 4 5 6 все