2009-05-15 2 views
0

Я столкнулся с проблемой памяти, используя FileReference.save(). Приложение My Flash генерирует большое количество данных в реальном времени и должно сохранять эти данные в локальном файле. Насколько я понимаю, Flash 10 (в отличие от AIR) не поддерживает потоковое воспроизведение в файл. Но хуже то, что FileReference.save() дублирует все данные перед сохранением. Я искал обходной путь к этому удвоенному использованию памяти и думал о следующем подходе:FileReference.save() duplicates ByteArray

Что делать, если я передаю собственный подкласс ByteArray в качестве аргумента FileReference.save(), где этот подкласс ByteArray переопределит все прочитанные *(). Переопределенные методы read *() будут ждать, когда часть моего файла будет сгенерирована моим приложением, вернет эту часть данных и немедленно удалит ее из памяти. Я знаю, сколько данных будет сгенерировано, поэтому я мог бы также переопределить методы length/bytesAvailable.

Возможно ли это? Не могли бы вы дать мне подсказку, как это сделать? Я создал подкласс ByteArray, зарегистрировал для него псевдоним, передал экземпляр этого подкласса в FileReference.save(), но каким-то образом FileReference.save(), кажется, относится к нему так же, как к экземпляру ByteArray, и не делает позвоните по любому из моих переопределенных методов ...

Большое спасибо за любую помощь!

ответ

0

Это не то, что я пробовал раньше, но вы можете попробовать отправить данные в php-приложение, которое будет обрабатывать ByteArray на сервере, подобно сохранению изображения на сервере, так что тогда вы будете использовать URLLoader.data вместо этого, используя что-то вроде этого:

http://www.zedia.net/2008/sending-bytearray-and-variables-to-server-side-script-at-the-same-time/

+0

К сожалению, это не решает мою проблему. Если я использую URLLoader для загрузки данных, мне нужно передать URLLoader.data в FileReference.save(), который снова будет дублировать URLLoader.data. Таким образом, это приведет к тому, что данные будут храниться дважды в памяти, что мне нужно избежать ... – bartekb

+0

О, извините, по какой-то причине я думал, что вы пытаетесь сохранить на сервере. Возможно, я зарегистрирую ошибку в JIRA о хранящихся данных дважды? В противном случае ... Я думаю, что FileReference.save - это ваш единственный способ записи на локальный диск. – quoo

0

это интересная идея. Возможно, вам нужно просто добавить трассировки в расширенный ByteArray, чтобы увидеть, как функция FileReference # save() внутренне работает.

Если у него есть какие-то

while(originalByteArray.bytesAvailable) 
    writeToSaveBuffer(originalByteArray.readByte()); 

функциональность переопределения может просто укоротить оригинальный буфер на каждом чтении, как вы говорите, что-то вроде:

override function readByte() : uint { 
    var b : uint = super.readByte(); 
    // Truncate the bytes (assuming bytesAvailable = length - removedBytes) 
    length = length - bytesAvailable; 
    return b; 
} 

С другой стороны, если это теперь работает, я думаю, исходный массив байтов больше не будет доступен после этого в приложении.

(я havn't испытал это сам, усечение может потребоваться больше работы, чем, например)

+0

Большое спасибо за интерес! Я пробовал это, но ни один из моих методов в расширенном ByteArray никогда не был вызван ... Я подозреваю, что FileReference # save() клонирует ByteArray, заданный как аргумент, используя ByteArray # readObject/writeObject, а затем работает над клонированным объектом. Но по какой-то странной причине мой расширенный ByteArray становится просто обычным ByteArray после такого клонирования! Я только что опубликовал эту проблему (что мешает мне отслеживать FileReference # save) в качестве отдельной проблемы: http://stackoverflow.com/questions/875163/trouble-cloning-an-extended-bytearray – bartekb