cdc/source/app.d

262 lines
14 KiB
D
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import std.stdio;
import std.string;
// Статическая таблица Gear (256 случайных 64-битных чисел)
mixin(import("gear.d"));
void printDetails(const ubyte[] src, const ulong fingerprint, const size_t i, const size_t mask) {
// Отпечаток со сдвигом
ulong fpOffset = fingerprint << 1;
// Номер байта
short charByte = src[i];
// Значение gear
ulong gearValue = gear[charByte];
// Итоговый fingerprint
ulong fpResult = fpOffset + gearValue;
writefln(
"\tОтпечаток = %d\n" ~
"\tОтпечаток со сдвигом (умножение на 2) = %d\n" ~
"\tПолучение байта (0-255) согласно индексу %d из исходной строки = %d\n" ~
"\tПолучение значения из таблицы gear согласно номеру байта = %d\n" ~
"\tСумма отпечатка со сдвигом с полученным значением из таблицы gear = %d\n" ~
"\tБитовое представление текущей маски = %b\n" ~
"\tБитовое представление итогового отпечатка = %b\n" ~
"\tРезультат наложения маски и отпечатка = %b\n",
fingerprint,
fpOffset,
i, charByte,
gearValue,
fpResult,
mask,
fpResult,
fpResult & mask
);
}
// Функция FastCDC с отладочной информацией
ulong fastcdc(const ubyte[] src, size_t n, size_t minSize, size_t maxSize,
size_t normalSize, ulong maskS, ulong maskL, size_t chunkNumber, bool debugEnabled)
{
if (n <= minSize)
{
if (debugEnabled)
{
writefln("%s: Ранний возврат: остаток=%d <= минимальный размер=%d, размер чанка=%d",
__FUNCTION__, n, minSize, n);
}
return n;
}
if (n > maxSize)
{
if (debugEnabled)
{
writefln("%s: Ограничение n до максимального размера: %d -> %d",
__FUNCTION__, n, maxSize);
}
n = maxSize;
}
if (n < normalSize)
{
if (debugEnabled)
{
writefln("%s: Корректировка нормального размера: %d -> %d",
__FUNCTION__, normalSize, n);
}
normalSize = n;
}
ulong fingerprint = 0;
size_t i = 0;
if (debugEnabled)
{
writefln("%s: Начало обработки чанка %d, остаток=%d, " ~
"минимальный размер=%d, нормальный размер=%d, максимальный размер=%d",
__FUNCTION__, chunkNumber, n, minSize, normalSize, maxSize);
}
// Инициализация fingerprint (отпечатка) для первых minSize байт (без проверки cut-point)
while (i < minSize)
{
fingerprint = (fingerprint << 1) + gear[src[i]];
if (debugEnabled)
{
writefln("%s: Фаза инициализации, индекс=%d, байт=%d, fingerprint=%d",
__FUNCTION__, i, src[i], fingerprint);
}
i++;
}
// Цикл до normalSize (строгая маска)
while (i < normalSize)
{
printDetails(src, fingerprint, i, maskS);
fingerprint = (fingerprint << 1) + gear[src[i]];
ulong masked = fingerprint & maskS;
if (debugEnabled)
{
writefln("%s: Фаза строгой маски, индекс=%d, байт=%d, fingerprint=%d, fingerprint & maskS=%d",
__FUNCTION__, i, src[i], fingerprint, masked);
}
if (masked == 0)
{
if (debugEnabled)
{
writefln("%s: Найдена точка разбиения на индексе=%d (строгая маска), размер чанка=%d",
__FUNCTION__, i, i);
}
return i;
}
i++;
}
// Цикл после (слабая маска)
while (i < n)
{
printDetails(src, fingerprint, i, maskL);
fingerprint = (fingerprint << 1) + gear[src[i]];
ulong masked = fingerprint & maskL;
if (debugEnabled)
{
writefln("%s: Фаза слабой маски, индекс=%d, байт=%d, fingerprint=%d, fingerprint & maskL=%d",
__FUNCTION__, i, src[i], fingerprint, masked);
}
if (masked == 0)
{
if (debugEnabled)
{
writefln("%s: Найдена точка разбиения на индексе=%d (слабая маска), размер чанка=%d",
__FUNCTION__, i, i);
}
return i;
}
i++;
}
if (debugEnabled)
{
writefln("%s: Точка разбиения не найдена, возвращается максимальный размер=%d",
__FUNCTION__, n);
}
return n; // Достигнут max
}
void main()
{
// Текст без переносов строк, \n заменены на пробел
string text = "Цель науки о данных — улучшить процесс принятия решений, " ~
"основывая их на более глубоком понимании ситуации с помощью " ~
"анализа больших наборов данных. Как область деятельности " ~
"наука о данных включает в себя ряд принципов, методов " ~
"постановки задач, алгоритмов и процессов для выявления " ~
"скрытых полезных закономерностей в больших наборах данных. " ~
"Она тесно связана с глубинным анализом данных и машинным " ~
"обучением, но имеет более широкий охват. Сегодня наука о " ~
"данных управляет принятием решений практически во всех " ~
"сферах современного общества. В повседневной жизни вы " ~
"ощущаете на себе воздействие науки о данных, когда видите " ~
"отобранные специально для вас рекламные объявления, " ~
"рекомендованные фильмы и книги, ссылки на предполагаемых " ~
"друзей, отфильтрованные письма в папке со спамом, " ~
"персональные предложения от мобильных операторов и " ~
"страховых компаний. Она влияет на порядок переключения и " ~
"длительность сигналов светофоров в вашем районе, на то, как " ~
"были созданы новые лекарства, продающиеся в аптеке, и то, как " ~
"полиция вычисляет, где может потребоваться ее присутствие. " ~
"Рост использования науки о данных в обществе обусловлен " ~
"появлением больших данных и социальных сетей, увеличением " ~
"вычислительной мощности, уменьшением размеров носителей " ~
"компьютерной памяти и разработкой более эффективных " ~
"методов анализа и моделирования данных, таких как глубокое " ~
"обучение. Вместе эти факторы означают, что сейчас процесс " ~
"сбора, хранения и обработки данных стал как никогда ранее " ~
"доступен для организаций. В то же время эти технические " ~
"новшества и растущее применение науки о данных означают, что " ~
"этические проблемы, связанные с использованием данных и " ~
"личной конфиденциальностью, тоже вышли на первый план. Цель " ~
"этой книги — познакомить с наукой о данных на уровне ее " ~
"основных элементов и с той степенью погружения, которая " ~
"обеспечит принципиальное понимание вопроса. " ~
"Глава 1 очерчивает область науки о данных и дает краткую " ~
"историю ее становления и эволюции. В ней мы также " ~
"рассмотрим, почему наука о данных стала такой востребованной " ~
"сегодня, и перечислим факторы, стимулирующие ее внедрение. В " ~
"конце главы мы развенчаем несколько мифов, связанных с темой " ~
"книги. Глава 2 вводит фундаментальные понятия, относящиеся к " ~
"данным. В ней также описаны стандартные этапы проекта: " ~
"понимание бизнес-целей, начальное изучение данных, " ~
"подготовка данных, моделирование, оценка и внедрение. Глава 3 " ~
"посвящена инфраструктуре данных и проблемам, связанным с " ~
"большими данными и их интеграцией из нескольких источников. " ~
"Одна из таких типичных проблем заключается в том, что данные " ~
"в базах и хранилищах находятся на одних серверах, а " ~
"анализируются на других. Поэтому колоссальное время тратится " ~
"на перемещение больших наборов данных между этими " ~
"серверами. Глава 3 начинается с описания типичной " ~
"инфраструктуры науки о данных для организации и некоторых " ~
"свежих решений проблемы перемещения больших наборов " ~
"данных, а именно: метода машинного обучения в базе данных, " ~
"использования Hadoop для хранения и обработки данных, а также " ~
"разработки гибридных систем, в которых органично сочетаются " ~
"традиционное программное обеспечение баз данных и решения, " ~
"подобные Hadoop. Глава завершается описанием проблем, " ~
"связанных с интеграцией данных в единое представление для " ~
"последующего машинного обучения. Глава 4 знакомит читателя с " ~
"машинным обучением и объясняет некоторые из наиболее " ~
"популярных алгоритмов и моделей, включая нейронные сети, " ~
"глубокое обучение и деревья решений. В главе 5 основное " ~
"внимание уделяется использованию опыта в области машинного " ~
"обучения для решения реальных задач, приводятся примеры " ~
"анализа стандартных бизнес-проблем и того, как они могут быть " ~
"решены с помощью машинного обучения. В главе 6 " ~
"рассматриваются этические вопросы науки о данных, последние " ~
"разработки в области регулирования и некоторые из новых " ~
"вычислительных методов защиты конфиденциальности в " ~
"процессе обработки данных. Наконец, в главе 7 описаны сферы, " ~
"на которые наука о данных окажет наибольшее влияние в " ~
"ближайшем будущем, изложены принципы, позволяющие " ~
"определить, будет ли данный конкретный проект успешным.";
// Конвертация в ubyte[] (UTF-8)
ubyte[] data = cast(ubyte[]) text;
size_t totalLength = data.length;
writefln("Общая длина текста (в байтах): %d", totalLength);
// Параметры FastCDC (в байтах, адаптированы для текста)
size_t minSize = 100; // 100 байт
size_t normalSize = 200; // 200 байт (цель)
size_t maxSize = 500; // 500 байт
// Маски (для normalSize ~200 байт, log2(200) ≈ 8 бит, уровень нормализации 2)
// ulong maskS = (1UL << 8) - 1; // 8 бит: 0b11111111
// ulong maskL = (1UL << 4) - 1; // 4 бита: 0b1111
ulong maskS = 0b1111_1111;
ulong maskL = 0b1111;
// Разбиение на чанки
size_t offset = 0;
size_t chunkNumber = 1;
// Включаем отладку
bool debugEnabled = true;
writeln("Размеры и содержимое чанков:");
while (offset < totalLength)
{
size_t remaining = totalLength - offset;
// Включаем отладку только для первых двух чанков
debugEnabled = chunkNumber <= 2;
size_t chunkSize = fastcdc(data[offset .. $], remaining, minSize, maxSize,
normalSize, maskS, maskL, chunkNumber, debugEnabled);
// Вывод размера чанка и его содержимого
writefln("Чанк %d: %d байт", chunkNumber, chunkSize);
string chunkContent = cast(string) data[offset .. offset + chunkSize];
// writefln("Содержимое: %s\n", chunkContent.length > 50 ? chunkContent[0 .. 50] ~ "..."
// : chunkContent);
writefln("Содержимое: %s\n", chunkContent);
offset += chunkSize;
chunkNumber++;
}
}