GridFS и chunkSize - наша база данных GridFS слишком велика по сравнению с реальными данными / файлами, хранящимися
У нас есть приложение, которое использует MongoDB (v. 3.4) в качестве основного хранилища данных. Мы широко используем GridFS, и пока db растет, у нас возникают серьезные проблемы с его размером. У нас есть приблизительно. 8000 файлов загружены в GridFS (с использованием драйвера Java) ... сумма длин файлов составляет около 30 ГБ, но база данных имеет размер 350 ГБ... так что это в 10 раз больше. Мы не можем видеть никаких причин, кроме вещи chunkSize. У нас есть несколько больших файлов в БД, но большинство файлов меньше, чем размер по умолчанию 256 КБ. Размер см. В примере ниже.
Я прочитал несколько дискуссий, в которых говорится, что не беспокойтесь об этом, реальное хранилище занимает только размер файла плюс несколько байтов. Но это не похоже на нашу базу данных. Может кто-нибудь подтвердить, как это должно работать? У нас есть набор реплик с ведомыми устройствами, размер базы данных которых также составляет 350 Гб, так что, похоже, это не проблема повреждения базы данных. Мы попытались очистить базу данных... но никак не могли.
{
"_id" : ObjectId("572c6877f0ea0bbab3b67015"),
"metadata" : {
"id" : "F735ADCACB662DD5C1257FAB0023B5CC",
"name" : "file"
},
"filename" : "1150228.jpg",
"aliases" : null,
"chunkSize" : NumberLong(261120),
"uploadDate" : ISODate("2016-05-06T09:48:39.136Z"),
"length" : NumberLong(36368),
"contentType" : null,
"md5" : "fd3393af027e0f1ff799ac4b1c117d58"
}
РЕДАКТИРОВАТЬ 1: я сделал mongofiles -d database list
в файл и открыт в Excel и суммировал размеры файлов, показывает 35 ГБ.
Решено: я запустил предложенную команду mongo --quiet --eval 'db.fs.chunks.aggregate([{$group:{_id: "$files_id", chunks: {$sum: 1}}}]).forEach(function(f){print(f._id + "\t" + f.chunks)})'
агрегировать коллекцию чанков по file_id и количеству связанных чанков. В длинном файле я нашел только один элемент с>20 миллионами кусков, и это вызвало проблему. Теперь довольно легко удалить все эти куски, а затем сжать базу данных...
1 ответ
Я выполнил предложенную команду
mongo --quiet --eval 'db.fs.chunks.aggregate([{$group:{_id: "$files_id", chunks: {$sum: 1}}}]).forEach(function(f){print(f._id + "\t" + f.chunks)})'
агрегировать коллекцию чанков по file_id и количеству связанных чанков. В длинном файле я нашел только один элемент с>20 миллионами кусков, и это вызвало проблему. Теперь довольно легко удалить все эти куски, а затем сжать базу данных...