Где хранятся двоичные данные Blob?

Дано

var data = new Array(1000000);
for (var i = 0; i < data.length; i++) {
  data[i] = 1;
}
var blob = new Blob([data]);

где хранится двоичное представление данных массива?

 duskwuff07 июл. 2016 г., 09:16
Ты имеешь в виду что-то помимо "в памяти"?
 Bergi10 июл. 2016 г., 18:24
@ guest271314: Это может быть какая-то структура в ОЗУ или на жестком диске, я не знаю, и это не имеет значения - это не структура, доступная непосредственно через JavaScript.
 Bergi10 июл. 2016 г., 18:55
@ guest271314: То же самое там. Да, конечно, если вы отладите процесс браузера, вы сможете найти данные (и, возможно, даже в какой-то временной папке, используемой браузером), но они все еще недоступны из JavaScript.
 guest27131408 июл. 2016 г., 08:30
@ Duskwuff Это то, что вы имеете в видуstatic void populateBlobData(BlobData*, const HeapVector<ArrayBufferOrArrayBufferViewOrBlobOrUSVString>& parts, bool normalizeLineEndingsToNative); cs.chromium.org/chromium/src/third_party/WebKit/Source/core/... , cs.chromium.org/chromium/src/third_party/WebKit/Source/platform/... ?
 guest27131410 июл. 2016 г., 18:27
@ Берги Правда? Как вы можете в одном комментарии заявить"И ответ нет, кстати" , то при следующем комментарии«Это может быть какая-то структура в ОЗУ или на жестком диске, я не знаю, и это не имеет значения» ? Конечно это важно; все "имеет значение". Если вы не знаете наверняка, как вы можете быть уверены, что нет подходов, которые можно было бы использовать для доступа к данным? Необработанные двоичные данные хранятся вBlob может бытьechoиздphp; по-видимому, есть какая-то форма данных, прикрепленная к объекту, которая доступна? Или, по крайней мере, встроен на каком-то низком уровне?
 guest27131410 июл. 2016 г., 21:37
@Bergi Обходной путь для чтенияBlob данные без использованияFileReader stackoverflow.com/a/38295759; хотя обратите внимание, использует технологииResponse а такжеReadableStream.getReader(), которые, по-видимому, не были доступны на момент выпуска Safari 5.1.4; что, частично, мотивировало этот вопрос
 guest27131410 июл. 2016 г., 18:52
@ Берги А как насчетPOST данные вXMLHttpRequest? Учитывая ограничение неиспользования.responseType а среда сафари 5.1.4? Будет ли выходить за рамки этого Вопроса, чтобы определить, где находится слот памяти?Blob хранится? Или может быть ссылка наBlob данные в памяти в профиле браузера или в папке конфигурации? когдаBlob являетсяPOSTред какjavascript отправить необработанные данные? Почему эти данные не доступны? fwiw, как примечание к этому запросу, обнаружил, что может создатьFile объект изBlob сFormData.append() без использованияnew File() конструктор.
 Bergi10 июл. 2016 г., 18:46
@ guest271314: Это серверные функции, они вам не помогут. Нет, невозможно перехватить данные, которые браузеры считывают из файла на диске и отправляют на сервер.
 Bergi10 июл. 2016 г., 15:36
@ guest271314: Если вы хотите узнать, как вы можете получить доступ к данным, хранящимся в BLOB-объекте, через JavaScript, вам следует спроситьтот, И ответнеткстати
 Bergi10 июл. 2016 г., 18:31
@ guest271314 "Или, по крайней мере, прилагается на некотором низком уровне«Да, это именно то, что я имею в виду - низкий уровень, недоступный через JavaScript.
 guest27131410 июл. 2016 г., 18:19
@Bergi«Если вы хотите знать, как вы можете получить доступ к данным, хранящимся в BLOB-объекте, с помощью javascript, то вам следует спросить об этом». Спросил чтоmsgstr "где хранится двоичное представление данных массива?" ? Если ответ «нет», можете ли вы опубликовать ответ, включая технические деталиЗачем?
 Bergi10 июл. 2016 г., 18:30
Просто потому, что интерфейс DOMBlob не содержит данных? Такжеот MDN: "BLOB-объекты представляют данные, которые не обязательно имеют собственный формат JavaScript.". Тебе необходимоFileReader чтобы получить байты отBlobВот как это работает.
 guest27131410 июл. 2016 г., 18:39
@ Берги действительно нашел прокладкиBlobи должно быть возможно создавать альтернативные версииBlob а такжеFileReaderХотя интересно, где хранятся реальные необработанные данные? Почему это возможноPOST толькоBlob вphpи получить двоичное представлениеBlob данные в ответ? Можноfile_get_contents а такжеphp://input тиражироваться вjavascript?
 guest27131408 июл. 2016 г., 07:20
@duskwuff В настоящее время не разбираюсь в языке, написанном наC++?. Указывает ли источник на хромBlob хранится в памятиcs.chromium.org/chromium/src/third_party/WebKit/Source/core/... , cs.chromium.org/chromium/src/third_party/WebKit/Source/core/... ? В частности, ссылка на#include <memory> вcs.chromium.org/chromium/src/third_party/WebKit/Source/platform/... ?
 guest27131410 июл. 2016 г., 18:35
@ Берги пытался собрать то, чтоstatic void populateBlobData(BlobData*, const HeapVector<ArrayBufferOrArrayBufferViewOrBlobOrUSVString>& parts, bool normalizeLineEndingsToNative); см ссылку в предыдущем комментарии; делает в источнике хрома, хотя не очень хорошо разбираются вC++? Также пытался искать начальные посты обсужденияFileReader, хотя не смог найти старые посты или списки рассылки, касающиеся того, какFileReader на самом деле доступ кBlob данные? Еще один способ сделать запрос может состоять в том, как создать прокладку или повторить функциональностьFileReader с нуля?
 guest27131407 июл. 2016 г., 09:22
@duskwuff Да. ЯвляетсяBlob бинарные данные хранятся в самом объекте или во внутренних элементах браузера? Как получить доступ к необработанным двоичным данным напрямую? связанные сstackoverflow.com/questions/38195855/..., Попытка определить, где в браузере хранятся фактические необработанные двоичные данные;IndexDB в папке конфигурации браузера? Другой? Можете ли вы предоставить подробную информацию о"в памяти"?

Ответы на вопрос(3)

объект blob, вы можете проверить его в профайлере памяти Firefox (about: memory). Пример вывода Firefox, здесь мы можем видеть, выбранные файлы. Существует разница между Blob и File. Blob хранится в памяти, File хранится в файловой системе.

651.04 MB (100.0%) -- explicit
├──430.49 MB (66.12%) -- dom
│  ├──428.99 MB (65.89%) -- memory-file-data
│  │  ├──428.93 MB (65.88%) -- large
│  │  │  ├────4.00 MB (00.61%) ── file(length=2111596, sha1=b95ccd8d05cb3e7a4038ec5db1a96d206639b740)
│  │  │  ├────4.00 MB (00.61%) ── file(length=2126739, sha1=15edd5bb2a17675ae3f314538b2ec16f647e75d7)

В Google Chrome есть ошибка. Chrome имеет ограничение по количеству объектов. При создании общая сумма капли больше 500мб. Браузер прекратит создание больших двоичных объектов, поскольку объем хранилища больших двоичных объектов достиг 500 МБ. Единственный способ избежать этого - записать большой двоичный объект в IndexDb и удалить из IndexDb. Когда BLOB-объект записывается в indexDb, объект BLOB-объекта автоматически сохраняется в файловой системе (BLOB-объект преобразуется в файл). BLOB-объекты будут удалены из памяти с помощью сборщика мусора после того, как вы перестанете их использовать или сделаете blob = null. Но GC удалит блоб через некоторое время, а не мгновенно.

Решение Вопроса

которые явно не представлены в каком-либо другом хранилище, хранятся в памяти (ОЗУ) и остаются там до конца вашей программы или пока вы не удалите ее (очистите ее из памяти).

TLDR; В оперативной памяти

 guest27131407 июл. 2016 г., 09:24
Можете ли вы предоставить подробную информацию о"TLDR; в оперативной памяти" конкретных дляBlob реализация в браузере?
 Thomas27 мая 2017 г., 22:09
@ guest271314 не существует такой вещи, как «реализация в браузере», есть несколько механизмов JS, умноженных на несколько версий в разных браузерах, и у каждого из них может быть (немного) разный подход к этому. Единственное, что определено в стандартах, это API класса Blob; как должно вести себя в JS. Детали реализации полностью разработаны разработчиками браузера.
 Justinas07 июл. 2016 г., 10:09
@ guest271314 Он слишком широк и слишком специфичен для StackOverflow по такому конкретному вопросу (я прошел 1-летний курс по компьютерной архитектуре в университете, чтобы узнать, как информация сохраняется в памяти и к которой впоследствии обращаются). Попробуйте некоторые сторонние ресурсы. Понравилась ссылкаcomputer.howstuffworks.com/ram.htm

Так что же происходит, когдаnew Blob() объявлен?

Отофициальный файл API документации,

The Blob() constructor can be invoked with zero or more parameters. When the Blob() constructor is invoked, user agents must run the following Blob constructor steps:
[1] If invoked with zero parameters, return a new Blob object with its readability state set to OPENED, consisting of 0 bytes, with size set to 0, and with type set to the empty string.
[2] Otherwise, the constructor is invoked with a blobParts sequence. Let a be that sequence.
[3] Let bytes be an empty sequence of bytes.
[4] Let length be `a`s length. For 0 ≤ i < length, repeat the following steps:
    1. Let element be the ith element of a.
    2. If element is a DOMString, run the following substeps:
        Let s be the result of converting element to a sequence of Unicode characters [Unicode] using the algorithm for doing so in WebIDL.
        Encode s as UTF-8 and append the resulting bytes to bytes.
    Note:
        The algorithm from WebIDL [WebIDL] replaces unmatched surrogates in an invalid UTF-16 string with U+FFFD replacement characters. Scenarios exist when the Blob constructor may result in some data loss due to lost or scrambled character sequences.  

    3. If element is an ArrayBufferView [TypedArrays], convert it to a sequence of byteLength bytes from the underlying ArrayBuffer, starting at the byteOffset of the ArrayBufferView [TypedArrays], and append those bytes to bytes.
    4. If element is an ArrayBuffer [TypedArrays], convert it to a sequence of byteLength bytes, and append those bytes to bytes.
    5. If element is a Blob, append the bytes it represents to bytes. The type of the Blob array element is ignored.  
[5] If the type member of the optional options argument is provided and is not the empty string, run the following sub-steps:
    1. Let t be the type dictionary member. If t contains any characters outside the range U+0020 to U+007E, then set t to the empty string and return from these substeps.
    2. Convert every character in t to lowercase using the "converting a string to ASCII lowercase" algorithm.
[6] Return a Blob object with its readability state set to OPENED, referring to bytes as its associated byte sequence, with its size set to the length of bytes, and its type set to the value of t from the substeps above. 

A Blob хранится в памяти так же, как и любой другойArrayBuffer, Он хранится в оперативной памяти, как и другие объекты, объявленные в окне.

Глядя наchrome://blob-internalsМы можем видеть, как его физически хранятся в оперативной памяти. Вот пример блоба.

c7828dad-dd4f-44e6-b374-9239dbe35e35
    Refcount: 1
    Status: BlobStatus::DONE: Blob built with no errors.
    Content Type: application/javascript
    Type: file
    Path: /Users/Chetan/Library/Application Support/Google/Chrome/Default/blob_storage/c7828dad-dd4f-44e6-b374-9239dbe35e35/0
    Modification Time: Monday, June 5, 2017 at 4:29:53 PM
    Offset: 4,917,846
    Length: 224,733

При печати фактического содержимого большого двоичного объекта мы получаем обычный файл js.

$ cat c7828dad-dd4f-44e6-b374-9239dbe35e35/0

...
html {
   font-family: sans-serif;
   /* 1 */
   -ms-text-size-adjust: 100%;
   /* 2 */
   -webkit-text-size-adjust: 100%;
   /* 2 */ }

/**
 * Remove default margin.
 */
body {
    margin: 0; }
...
 TheChetan05 июн. 2017 г., 13:42
@ guest271314 Plaese смотри обновленный ответ
 marchello17 мая 2018 г., 10:39
как вы могли бы распечатать этот контент сcat?

Ваш ответ на вопрос