小编Gna*_*nat的帖子

为什么我不应该使用F#异步工作流来实现并行化?

我最近一直在学习F#,特别感兴趣的是它易于利用数据并行性.这个data |> Array.map |> Async.Parallel |> Async.RunSynchronously成语似乎很容易理解,直接使用并从中获得真正的价值.

那么为什么它async不是真正意图呢?Donald Syme本人表示,PLINQ和期货可能是更好的选择.我在这里读到的其他答案同意这一点以及推荐TPL.(PLINQ与上述内置函数似乎没什么不同,只要您使用F#Powerpack来获取PSeq函数.)

F#和函数式语言对此非常有意义,并且一些应用程序async并行性方面取得了巨大成功.

那么为什么我不应该async用来执行并行数据流程呢?通过编写并行async代码而不是使用PLINQ或TPL,我将失去什么?

parallel-processing f# asynchronous task-parallel-library

19
推荐指数
2
解决办法
3011
查看次数

我应该使用JDBC getNString()而不是getString()吗?

我们正在构建一个由我们使用JDBC(驱动程序ojdbc6.jarorai18n.jar)访问的Oracle数据库支持的Java应用程序.数据库模式主要使用NVARCHAR2数据类型存储文本列.

JDBC文档的JDBC ResultSet说,getNString()尤其用于与NCHAR,NVARCHAR等数据类型使用,但目前我们只使用getString().

这似乎工作正常,所以我想知道为什么我应该使用getNString()而不是getString().是getString()要启动失败如果非ASCII字符输入,或者是哪个方法,我应该使用Oracle JDBC驱动程序无动于衷?

编辑:似乎它可能依赖于数据库:SQL Server似乎不介意您使用哪个,具体取决于连接参数.有没有人有关于Oracle的任何具体信息?

java oracle nvarchar jdbc

12
推荐指数
1
解决办法
1万
查看次数

F#中的慢尾递归

我有一个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)

performance f# tail-recursion

4
推荐指数
3
解决办法
673
查看次数

为什么在手动强制GC执行之前,已发布的ArcObjects COM对象尚未完成?

我正在开发一个.NET应用程序,用于处理通过ESRI自己的.NET互操作程序集使用ESRI的ArcObjects COM库的地理数据.

在生产中运行时,由于达到每个进程2GB的内存限制,进程在某些操作期间可能会崩溃.(ArcObjects是一个32位库.)这是因为某些处理步骤可以创建许多临时ArcObjects几何对象.尽管使用FinalReleaseComObject和关联的辅助方法手动释放这些对象,它仍会泄漏内存并最终耗尽内存.但是,我可以强制GC通过调用释放内存WaitForPendingFinalizers,并定期调用它GC.CollectFinalReleaseComObject保持内存使用受控制.否则,许多对象将保留在内存中,直到进程退出(正常或异常).

第一个问题:为什么不立即释放ArcObjects COM对象所占用的内存?或者,为什么GC允许进程崩溃而不是最终确定已发布的COM对象并在崩溃之前回收内存?

该应用程序在Windows 2008 64位上运行,而我使用Windows 7 32位开发.我可以让生产盒上的进程崩溃,但不能在我的开发盒上崩溃.我认为这可能是因为本地我通常在Visual Studio中使用Debug构建运行,但我也尝试使用Release版本而没有调试器(Start Without Debugging),但即便如此,它也没有在任何地方使用内存与生产中一样,不会崩溃.

第二个问题:为什么?

编辑:在我以前的实验中,我发现它GC.Collect本身是不够的,即使我明确地称之为它.我有一个实用程序方法,在每次算法迭代后调用GC.Collect后跟GC.WaitForPendingFinalizers并调用它,以减少内存使用量.

.net com garbage-collection memory-leaks arcobjects

2
推荐指数
1
解决办法
1308
查看次数