【发布时间】:2017-08-08 05:51:10
【问题描述】:
我正在尝试在 Air 桌面应用程序中加载 600mb 文件的 10mb 块。起初我尝试加载整个文件,但出现“系统内存不足”错误,或者 SWF 将直接退出而没有错误。
我还没有将文件的一部分读取到字节数组中,清除数组然后读取下一部分。这效果更好,但它仍然会在文件末尾出现内存问题。
据我了解,以下方法应仅读取请求的文件部分。但我认为由于某种原因,实际上读取了我想要的块的开头到结尾的文件。我的精简代码如下所示:
var file:File = File.desktopDirectory.resolvePath('input.txt');
var fileStream:FileStream = new FileStream();
fileStream.addEventListener(Event.COMPLETE, onLoaded);
fileStream.openAsync(file, FileMode.READ);
fileStream.position = _currentPos;
加载中:
var fileStream:FileStream = event.target as FileStream;
_fileSize = fileStream.bytesAvailable;
bytes.clear();
fileStream.readBytes(bytes, 0, 10000000);
然后我对字节做一些事情并再次调用上面的代码,这次位置是前一个位置加上前一个读取的长度。
当我检查字节数组时,我可以看到大小等于文件的开头到读取的结尾。字节数组在读取开始之前的元素中不包含任何数据,这是我的预期。
所以我是只读取我想要的块还是整个文件?
如果我不是,我可以这样做吗?
如何解决内存问题?
我得到的错误是
Error: Error #1000: The system is out of memory.
at flash.filesystem::FileStream/readBytes()
编辑:
经过更多测试,我确信整个文件都被读入了内存。
System.privateMemory 报告的内存使用量刚好高于文件大小,当我检查 FileStream 时,我看到的是文件本身的大小,而不是我想要的块。
编辑 2:我现在添加了预读和进度事件,但是它实际上以相同的方式运行,除了我控制预读大小。 readAhead 是否实际上阻止了从文件开头到读取位置开始读取文件?
好像 fileStream.position 并没有真正做任何事情。
我的新代码如下所示:
private function read(pos:int):void {
_bytes.clear();
var file:File = File.desktopDirectory.resolvePath('big.mp4');
var fileStream:FileStream = new FileStream();
fileStream.readAhead = 10000000;
fileStream.addEventListener(ProgressEvent.PROGRESS, readProgressHandler)
fileStream.openAsync(file, FileMode.READ);
fileStream.position = _pos;
function readProgressHandler(event:ProgressEvent):void {
if (fileStream.bytesAvailable >= 10000000) {
fileStream.removeEventListener(ProgressEvent.PROGRESS, readProgressHandler)
fileStream.readBytes(_bytes, _pos, 10000000);
fileStream.close();
//get next bit
go();
}
}
}
private function go():void {
_pos = _pos + 10000000;
read(_pos);
}
【问题讨论】:
-
尝试在每次释放使用的数据时调用 System.gc()。垃圾收集器应该自己挑选释放的数据,但如果你不断地读取新数据,GC 可能没有机会完成它的工作。我还建议跟踪 System 类内存值,以更好地了解您的系统在读取过程中发生了什么:help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
-
谢谢,GC 确实帮助避免了一点内存错误,但它并没有真正解决问题,因为我想读取更大的文件。
-
好吧,我刚刚打开了 FileStream 文档,看看我发现了什么:help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
-
我添加了预读并如上所述修改了我的问题,因为我不确定它的解决方案。
-
一个问题。为什么还要使用异步模式?
标签: actionscript-3 flash actionscript air