我最近一直在学习F#,特别感兴趣的是它易于利用数据并行性.这个data |> Array.map |> Async.Parallel |> Async.RunSynchronously
成语似乎很容易理解,直接使用并从中获得真正的价值.
那么为什么它async
不是真正意图呢?Donald Syme本人表示,PLINQ和期货可能是更好的选择.我在这里读到的其他答案同意这一点以及推荐TPL.(PLINQ与上述内置函数似乎没什么不同,只要您使用F#Powerpack来获取PSeq
函数.)
F#和函数式语言对此非常有意义,并且一些应用程序在async
并行性方面取得了巨大成功.
那么为什么我不应该async
用来执行并行数据流程呢?通过编写并行async
代码而不是使用PLINQ或TPL,我将失去什么?
我们正在构建一个由我们使用JDBC(驱动程序ojdbc6.jar
和orai18n.jar
)访问的Oracle数据库支持的Java应用程序.数据库模式主要使用NVARCHAR2
数据类型存储文本列.
该JDBC文档的JDBC ResultSet
说,getNString()
尤其用于与NCHAR,NVARCHAR等数据类型使用,但目前我们只使用getString()
.
这似乎工作正常,所以我想知道为什么我应该使用getNString()
而不是getString()
.是getString()
要启动失败如果非ASCII字符输入,或者是哪个方法,我应该使用Oracle JDBC驱动程序无动于衷?
编辑:似乎它可能依赖于数据库:SQL Server似乎不介意您使用哪个,具体取决于连接参数.有没有人有关于Oracle的任何具体信息?
我有一个F#函数,它以跳过n的模式返回从0开始的数字列表,选择n,跳过n,选择n ......达到限制.例如,输入2的此函数将返回[2, 3, 6, 7, 10, 11...]
.
最初我将其实现为非尾递归函数,如下所示:
let rec indicesForStep start blockSize maxSize =
match start with
| i when i > maxSize -> []
| _ -> [for j in start .. ((min (start + blockSize) maxSize) - 1) -> j] @ indicesForStep (start + 2 * blockSize) blockSize maxSize
Run Code Online (Sandbox Code Playgroud)
认为尾递归是可取的,我使用累加器列表重新实现它如下:
let indicesForStepTail start blockSize maxSize =
let rec indicesForStepInternal istart accumList =
match istart with
| i when i > maxSize -> accumList
| _ …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个.NET应用程序,用于处理通过ESRI自己的.NET互操作程序集使用ESRI的ArcObjects COM库的地理数据.
在生产中运行时,由于达到每个进程2GB的内存限制,进程在某些操作期间可能会崩溃.(ArcObjects是一个32位库.)这是因为某些处理步骤可以创建许多临时ArcObjects几何对象.尽管使用FinalReleaseComObject
和关联的辅助方法手动释放这些对象,它仍会泄漏内存并最终耗尽内存.但是,我可以强制GC通过调用释放内存WaitForPendingFinalizers
,并定期调用它GC.Collect
并FinalReleaseComObject
保持内存使用受控制.否则,许多对象将保留在内存中,直到进程退出(正常或异常).
第一个问题:为什么不立即释放ArcObjects COM对象所占用的内存?或者,为什么GC允许进程崩溃而不是最终确定已发布的COM对象并在崩溃之前回收内存?
该应用程序在Windows 2008 64位上运行,而我使用Windows 7 32位开发.我可以让生产盒上的进程崩溃,但不能在我的开发盒上崩溃.我认为这可能是因为本地我通常在Visual Studio中使用Debug构建运行,但我也尝试使用Release版本而没有调试器(Start Without Debugging),但即便如此,它也没有在任何地方使用内存与生产中一样,不会崩溃.
第二个问题:为什么?
编辑:在我以前的实验中,我发现它GC.Collect
本身是不够的,即使我明确地称之为它.我有一个实用程序方法,在每次算法迭代后调用GC.Collect
后跟GC.WaitForPendingFinalizers
并调用它,以减少内存使用量.
f# ×2
.net ×1
arcobjects ×1
asynchronous ×1
com ×1
java ×1
jdbc ×1
memory-leaks ×1
nvarchar ×1
oracle ×1
performance ×1