我们正在为Scala(学生项目)开发一个小型图像处理库.该库完全正常(即没有可变性).存储图像的光栅Stream[Stream[Int]]以便以最少的努力利用惰性评估的益处.但是,在对映像执行一些操作时,堆会变满并OutOfMemoryError抛出一个.(例如,在JVM堆耗尽空间之前,最多可以对大小为500 x 400的jpeg映像执行4次操作,35 kb.)
我们想到的方法是:
Stream[Stream[Int]],更适合图像处理的任务.(同样,我们对简单List和以外的功能数据结构没有太多了解Stream.)我们的最后一个选择是放弃不变性并使其成为一个可变的库(如流行的图像处理库),我们并不是真的想做.如果你知道我的意思,请建议我们一些方法来保持这个库的功能和功能.
谢谢,
Siddharth Raina.
ADDENDUM:
对于大小为1024 x 768的映像,即使对于单个映射操作,JVM也会耗尽堆空间.我们测试的一些示例代码:
val image = Image from "E:/metallica.jpg"
val redded = image.map(_ & 0xff0000)
redded.display(title = "Redded")
Run Code Online (Sandbox Code Playgroud)
并输出:
"C:\Program Files (x86)\Java\jdk1.6.0_02\bin\java" -Didea.launcher.port=7533 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 10.0.2\bin" -Dfile.encoding=windows-1252 -classpath "C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\charsets.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\deploy.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\javaws.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\jce.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\jsse.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\management-agent.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\plugin.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\resources.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\rt.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\ext\dnsns.jar;C:\Program Files (x86)\Java\jdk1.6.0_02\jre\lib\ext\localedata.jar;C:\Program Files …Run Code Online (Sandbox Code Playgroud) programming-languages functional-programming scala image-processing
假设MyClass是一个用Java定义的类,并且有许多静态成员和非静态成员.我试图在Scala对象中MyObject为此类(和关联的伴随对象)设置别名,如下所示:
object MyObject {
import javastuff._
type MyAlias = MyClass
val MyAlias = MyClass
}
Run Code Online (Sandbox Code Playgroud)
Scalac抱怨道:
error: object MyClass is not a value
val MyAlias = MyClass
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?谢谢.
我正在尝试为2D数组编写迭代器.以下是我的想法.
def rowsTest() {
val array = Array(
Array(9, 11, 4, 89),
Array(7, 62, 34, 2),
Array(3, 4, 5, 12),
Array(13, 4, 5, 12),
Array(3, 24, 5, 12),
Array(3, 4, 35, 12)
)
def rows: Iterator[Iterator[Int]] = {
new Iterator[Iterator[Int]] {
private var rowIndex = 0
def hasNext: Boolean = rowIndex < 6
def next: Iterator[Int] = {
val rowIterator = new Iterator[Int] {
private var columnIndex = 0
def next: Int = {
val p = array(columnIndex)(rowIndex)
columnIndex += …Run Code Online (Sandbox Code Playgroud)