- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要创建一个可用于速度和效率极其重要的应用程序的查找表。该表将存储时间值,这些时间值呈对数分布,因此每个数量级都具有相同数量的时间步长。每个时间值将指向一组波长值,这些波长值具有与之关联的强度值。所以像这样:
t lambda I
0.0001 -> 0.01 -> 100
. 0.02 -> 300
. . .
. . .
. .
0.0002 -> 0.01 -> 200
. 0.02 -> 400
. . .
. . .
. .
等...
某些 C 代码中的函数将传递一个时间和波长,并从表中查找相应的强度。生成正确强度所需的函数非常费力,所以这就是我选择使用查找表的原因。我希望将查找表写入一个二进制文件,因为该文件将在计算集群的许多节点上加载到 RAM 中或从 RAM 中加载出来。由于我不熟悉查找表,所以我想知道什么是最好的(最快/最有效的)实现方式。
此外,是否可以从用 python 创建的数据结构写入二进制文件,然后用 C 读取?这在我的特定应用程序中非常有用,因为我已经与一些 python 代码交互以生成表的值。
最佳答案
您可以使用 struct
module ,特别是 struct.pack
将 Python 数据转换为二进制数据字符串,然后您可以将其写入文件。
访问数据的最有效方式取决于具体情况。如果您对所有时间值使用相同范围的 lambda 值并且时间间隔始终相同,那么您知道每个 t 的强度数组的长度。在那种情况下,你可以说例如
offset = ((time - 0.001)/0.001 * amount_of_intensities + (lambda - 0.01)/0.01)
然后使用该偏移量创建一个指针。这假定您已将二进制文件读入内存并创建了指向它的正确类型的指针。
一个例子(在 IPython 中):
In [1]: import numpy as np
In [2]: data = np.random.random(20)
In [3]: data
Out[3]:
array([ 0.40184104, 0.60411243, 0.52083848, 0.50300288, 0.14613242,
0.39876911, 0.16157968, 0.70979254, 0.65662686, 0.14884378,
0.65650842, 0.40906677, 0.3027295 , 0.26070303, 0.82051509,
0.96337179, 0.34622595, 0.08532211, 0.65079174, 0.68009011])
In [4]: import struct
In [5]: struct.pack('{}d'.format(len(data)), *data)
Out[5]: 'f\xf9\x80y\xc3\xb7\xd9?\xe2x\x92\x99\xe3T\xe3?0vCt\xb5\xaa\xe0?7\xfcJ|\x99\x18\xe0?X\xf5l\x8ew\xb4\xc2?b\x9c\xd1\xden\x85\xd9?\xc4\x0c\xad\x9d\xa4\xae\xc4?\xae\xc3\xbe\xd7\x9e\xb6\xe6?\xd5\xf3\xebV\x16\x03\xe5?\x14J\x9a$P\r\xc3?p\xd4t\xf3\x1d\x02\xe5?\xfe\tUg&.\xda?\xf4hV\x91\xeb_\xd3?@FL\xc0[\xaf\xd0?$\xbe\x08\xda\xa8A\xea?\xf3\x93\xcb\x11\xf1\xd3\xee?\xce\x9e\xd9\xe7\x90(\xd6?\x10\xd2\x12c\xab\xd7\xb5?f\xac\x124I\xd3\xe4?}\x95\x1cSL\xc3\xe5?'
为了方便起见,我使用了 numpy 模块。它与 float 列表一样有效。
从里到外分析最后一行。格式表达式给出:
In [9]: '{}d'.format(len(data))
Out[9]: '20d'
这意味着我们要创建一个包含 20 个 d
值的字符串。 d
是 format character对于 IEEE 754 双宽度 float 。
所以我们真正拥有的是;
struct.pack('20d', *data)
data
之前的 *
运算符表示“解压此列表”。
请注意,二进制数通常不能在不同的硬件平台(例如 intel x86 和 ARM)之间移植。
一旦你有了这个大的二进制数数组,你就可以把它写入一个文件。
在 C 中,打开文件并将整个文件读入内存块。然后将正确类型的指针指向该内存块的开头,您就可以开始了。
关于python - 在python中制作查找表,写入可以在C程序中读取的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25144649/
我有这个代码 var myChart = new FusionCharts("../themes/clean/charts/hbullet.swf", "myChartId", "400", "75
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处? 事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基
我正在使用 mootool 的 Request.JSON 从 Twitter 检索推文。收到它后,我将写入目标 div 的 .innerHTML 属性。当我在本地将其作为文件进行测试时,即 file:
最终,我想将 Vertica DB 中的数据抓取到 Spark 中,训练机器学习模型,进行预测,并将这些预测存储到另一个 Vertica DB 中。 当前的问题是确定流程最后部分的瓶颈:将 Spark
我使用 WEKA 库编写了一个 Java 程序, 训练分类算法 使用经过训练的算法对未标记的数据集运行预测 将结果写入 .csv 文件 问题在于它当前写出离散分类结果(即算法猜测一行属于哪个类别)。我
背景 - 我正在考虑使用 clickonce 通过 clickonce(通过网站)部署 WinForms 应用程序。相对简单的应用程序的要素是: - 它是一个可执行文件和一个数据库文件(sqlite)
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
我正在读取 JSON 文件,取出值并进行一些更改。 基本上我向数组添加了一些值。之后我想将其写回到文件中。当我将 JSONArray 写回文件时,会被写入字符串而不是 JSONArray 对象。怎样才
我为两个应用程序使用嵌入式数据库,其中一个是服务器,另一个是客户端。客户端应用程序。可以向服务器端发送获取数据请求以检索数据并显示在表格(或其他)中。问题是这样的:如何将获取的数据保存(写入)到页面文
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
从问题得出问题:找到所有 result = new ArrayList(); for (int i = 2; i >(i%8) & 0x1) == 0) { result.add(i
由于某种原因,它没有写入 CSV。谁能明白为什么它不写吗? def main(): list_of_emails = read_email_csv() #read input file, cr
关闭。 这个问题是 not reproducible or was caused by typos 。它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能在这里出现,
我目前正在开发一个保存和加载程序,但我无法获得正确的结果。 编写程序: #include #include #define FILENAME "Save" #define COUNT 6 type
import java.io.*; public class Main2 { public static void main(String[] args) throws Exception {
我需要使用预定义位置字符串“Office”从所有日历中检索所有 iOS 事件,然后将结果写入 NSLog 和 UITextView。 到目前为止,这是我的代码: #import "ViewCo
我正在尝试将 BOOL 值写入 PFInstallation 中的列,但会不停地崩溃: - (IBAction)pushSwitch:(id)sender { NSUserDefaults *push
我以前在学校学过一些简单的数据库编程,但现在我正在尝试学习最佳实践,因为我正在编写更复杂的应用程序。写入 MySQL 数据库并不难,但我想知道让分布式应用程序写入 Amazon EC2 上的远程数据库
是否可以写回到ResourceBundle?目前我正在使用 ResourceBundle 来存储信息,在运行时使用以下内容读取信息 while(ResourceBundle.getBundle("bu
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!