小编Rap*_*oth的帖子

加载包含相同符号的两个本机库时内存问题

我正在尝试使用JNA同时操作本机的,非线程安全的Fortran库.由于库不是线程安全的,我尝试实例化同一个库的不同副本,但显然它们似乎共享内存地址.如果我修改一个库中的一个变量,则将另一个库中的变量修改为.此行为使得无法在单独的线程中以完全方式运行它们.

以下代码示例演示了我的意思:

code.f:

  subroutine set(var)
     implicit none
     integer var,n
     common/conc/n
     n=var
  end subroutine

  subroutine get(var)
     implicit none
     integer var,n
     common/conc/n
     var=n
  end subroutine
Run Code Online (Sandbox Code Playgroud)

此文件的编译和复制如下:

gfortran -shared -O2 code.f -o mylib.so -fPIC
cp mylib.so mylib_copy.so
Run Code Online (Sandbox Code Playgroud)

然后我使用JNA访问这两个:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;

public class JNA {
    public interface MyLib extends Library {
        public void set_(IntByReference var);
        public void get_(IntByReference var);
    }

    public static void main(String[] args) {
        System.setProperty("jna.library.path", ".");
        MyLib lib = (MyLib) Native.loadLibrary("mylib.so", MyLib.class);
        MyLib lib_copy = (MyLib) Native.loadLibrary("mylib_copy.so", MyLib.class); …
Run Code Online (Sandbox Code Playgroud)

fortran native jna

5
推荐指数
1
解决办法
127
查看次数

将现有变量标记为隐式方法的候选

我尝试编写一个应该使用周围范围变量的方法.问题是我无法访问定义变量的代码部分.像这样的东西:

object Example extends App {

  val myvar = 1.0 // cannot change that code

  def myMethod()(implicit value:Double) = {
      print(value)
  }

  myMethod()
}
Run Code Online (Sandbox Code Playgroud)

这失败了,因为myMethod无法找到合适的隐含value.

value除了定义指向的新隐式变量之外,还有一种方法可以在定义之后将其"标记" 为隐式value吗?

背景:我们使用Spark-Notebook 自动创建SparkContext(命名sc).作为sc社区中此变量的一个众所周知的名称,我们不希望引入另一个变量名称.

scala implicit

5
推荐指数
1
解决办法
454
查看次数

如何处理加载了 JNA 的库

我正在使用 JNA 来加载本机库:

MyLibrary INSTANCE = (MyLibrary) Native.loadLibrary("mylibrary.so", MyLibrary.class);
Run Code Online (Sandbox Code Playgroud)

现在我想清理并处置图书馆。我已经读过该dispose方法,但这是在类上定义的NativeLibrary,我应该如何调用它?

无论如何,有必要这样做吗?我正在大规模地将 jna 与 Apache Spark 一起使用,因此我加载了该库数千次,我想知道如果我明确调用 nit ,是否还有任何资源保持打开状态dispose

编辑:我已经看到了问题Jna, Unload Dll from java classdynamic,但它没有为我的问题提供解决方案。

没有公认的答案。人们建议调用NativeLibrary.dispose(),但NativeLibrary. 如果我尝试转换我的库实例(类型为Library),则会收到类转换异常。

jna

5
推荐指数
1
解决办法
4316
查看次数

代码中的奇怪行为,用于测试线程安全的单例

我对Java中的多线程很新.因为我需要一个线程安全的单例(我实现为枚举),我写了一个小的测试代码,它会产生一个奇怪的输出.

代码:

public enum EnumSingleton {
    INSTANCE;


    /** state variables */
    private String message;

    /** Constructor */
    private EnumSingleton() {
    }

    /** add well-known accessor for the instance  (is NOT necessary) */
    public static EnumSingleton getInstance() {
        return INSTANCE;
    }


    /** Accessors */
    public String getMessage() {
        return message;
    }

    public void setMessage(String name) {
        this.message = name;
    }
}

public class App {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) { …
Run Code Online (Sandbox Code Playgroud)

java singleton enums multithreading

4
推荐指数
2
解决办法
116
查看次数

如何将对象传递给Scala中的方法

如何将对象的引用传递给Scala中的方法?我想要这个编译

object Constants {
  val constantA:Double = ???
}


def calc(numbers:Seq[Double], Constants) = ??? // does not compile
def calc(numbers:Seq[Double], constants:Constants) = ??? // does not compile
Run Code Online (Sandbox Code Playgroud)

当然我可以在Constants不通过参数列表的情况下引用它,但我更愿意列出将方法的所有依赖项显式地作为参数传递.

methods singleton scala

4
推荐指数
1
解决办法
4058
查看次数

简洁的方法来过滤和映射包含选项的元组的scala序列

转换Seq of Tuples的最短方法是什么,例如:

val xs : Seq[(Long,Option[Double])]  = Seq((1L,None),(2L,Some(2.0)),(3L,None))
Run Code Online (Sandbox Code Playgroud)

Seq[(Long,Double)]通过除去诺内斯

我用过这两个

xs.filter(_._2.isDefined).map{case (i,x) => (i,x.get)}
Run Code Online (Sandbox Code Playgroud)

xs.flatMap{
  case (i,Some(x)) => Some(i,x)
  case _ => None
}
Run Code Online (Sandbox Code Playgroud)

但是想知道是否有更短的路.对于Seq[Option[Double]]我会做flatten...但这对嵌套选项不起作用.

scala

4
推荐指数
1
解决办法
153
查看次数

Spark 显示基于成本的优化器统计信息

我试图通过在 spark-shell 中设置属性来启用 Spark cbo spark.conf.set("spark.sql.cbo.enabled", true)

我现在正在跑步 spark.sql("ANALYZE TABLE events COMPUTE STATISTICS").show

运行此查询不会显示任何统计信息 spark.sql("select * from events where eventID=1").explain(true)

在 Spark 2.2.1 上运行

scala> spark.sql("select * from events where eventID=1").explain()
== Physical Plan ==
*Project [buyDetails.capacity#923, buyDetails.clearingNumber#924, buyDetails.leavesQty#925L, buyDetails.liquidityCode#926, buyDetails.orderID#927, buyDetails.side#928, cancelQty#929L, capacity#930, clearingNumber#931, contraClearingNumber#932, desiredLeavesQty#933L, displayPrice#934, displayQty#935L, eventID#936, eventTimestamp#937L, exchange#938, executionCodes#939, fillID#940, handlingInstructions#941, initiator#942, leavesQty#943L, nbbPrice#944, nbbQty#945L, nboPrice#946, ... 29 more fields]
+- *Filter (isnotnull(eventID#936) && (cast(eventID#936 as int) = 1))
+- *FileScan parquet default.events[buyDetails.capacity#923,buyDetails.clearingNumber#924,buyDetails.leavesQty#925L,buyDetails.liquidityCode#926,buyDetails.orderID#927,buyDetails.side#928,cancelQty#929L,capacity#930,clearingNumber#931,contraClearingNumber#932,desiredLeavesQty#933L,displayPrice#934,displayQty#935L,eventID#936,eventTimestamp#937L,exchange#938,executionCodes#939,fillID#940,handlingInstructions#941,initiator#942,leavesQty#943L,nbbPrice#944,nbbQty#945L,nboPrice#946,... 29 more fields] …
Run Code Online (Sandbox Code Playgroud)

apache-spark apache-spark-sql databricks

4
推荐指数
1
解决办法
1831
查看次数

导入不带SparkSession实例的隐式转换

我的Spark代码充满了这样的代码

object Transformations {   
  def selectI(df:DataFrame) : DataFrame = {    
    // needed to use $ to generate ColumnName
    import df.sparkSession.implicits._

    df.select($"i")
  }
}
Run Code Online (Sandbox Code Playgroud)

或者

object Transformations {   
  def selectI(df:DataFrame)(implicit spark:SparkSession) : DataFrame = {    
    // needed to use $ to generate ColumnName
    import sparkSession.implicits._

    df.select($"i")
  }
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么我们需要一个实例SparkSession来导入这些隐式转换。我想做这样的事情:

object Transformations {  
  import org.apache.spark.sql.SQLImplicits._ // does not work

  def selectI(df:DataFrame) : DataFrame = {    
    df.select($"i")
  }
}
Run Code Online (Sandbox Code Playgroud)

有解决这个问题的优雅方法吗?我使用implicits的并不限于$而且Encoders.toDF()等等。

scala implicits apache-spark

4
推荐指数
1
解决办法
267
查看次数

如何获取 Spark 列的字符串名称?

我想编写一种方法来舍入数字列,而不执行以下操作:

df
.select(round($"x",2).as("x"))
Run Code Online (Sandbox Code Playgroud)

因此我需要一个可重用的列表达式,例如:

def roundKeepName(c:Column,scale:Int) = round(c,scale).as(c.name)
Run Code Online (Sandbox Code Playgroud)

不幸的c.name是不存在,因此上面的代码无法编译。我找到了一个解决方案ColumName

 def roundKeepName(c:ColumnName,scale:Int) = round(c,scale).as(c.string.name)
Run Code Online (Sandbox Code Playgroud)

但是我该如何做到这一点Column(如果我使用col("x")而不是生成$"x"

scala apache-spark

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

用 2 个 y 轴绘制单迹线

我有一个绘图对象条形图,我想为其显示 2 个 y 轴(不同的货币,因此转换因子是常数)。

目前,我每条轨迹绘制 1 条,而对于第二条轨迹,我将不透明度设置为 0,禁用图例和悬停信息。这个 hack 有效,但维护起来很难。

我知道https://plotly.com/python/multiple-axes/

我当前的解决方案如下所示

import pandas as pd
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# make up some data
dates = pd.DataFrame(pd.date_range('1/1/2023','1/7/2023'), columns=['date'])
dates["key"] = 0
items = pd.DataFrame(["A","B","C"], columns=['items'])
items["key"] = 0
df = dates.merge(items,on="key",how="outer").drop("key",axis=1)
df['price_USD'] = np.random.randint(0, 100, df.shape[0])
df['price_EURO'] = df['price_USD']/1.5

fig = make_subplots(specs=[[{"secondary_y": True}]])  
for item, _df in df.groupby("items",sort=True):
    ## we may set the colors of the individual items manually …
Run Code Online (Sandbox Code Playgroud)

python plotly

4
推荐指数
1
解决办法
196
查看次数