我正在尝试使用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) 我尝试编写一个应该使用周围范围变量的方法.问题是我无法访问定义变量的代码部分.像这样的东西:
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
社区中此变量的一个众所周知的名称,我们不希望引入另一个变量名称.
我正在使用 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
),则会收到类转换异常。
我对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) 如何将对象的引用传递给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
不通过参数列表的情况下引用它,但我更愿意列出将方法的所有依赖项显式地作为参数传递.
转换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
...但这对嵌套选项不起作用.
我试图通过在 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) 我的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()
等等。
我想编写一种方法来舍入数字列,而不执行以下操作:
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"
)
我有一个绘图对象条形图,我想为其显示 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)