我有一个C函数
void read_FIFO_AI0(int16_t** input, size_t size, NiFpga_Session* session, NiFpga_Status* status)
{
*input = (int16_t*) malloc (size*sizeof(int16_t));
// function that populates the array *input
}
Run Code Online (Sandbox Code Playgroud)
填充数组"*input".现在我想将该数组中的数据传递给python进行进一步处理.我尝试使用ctypes来做到这一点:
def read_FIFO_AI0(size,session,status):
_libfpga.read_FIFO_AI0.argtypes = [POINTER(ARRAY(c_int16, size)), c_int, POINTER(c_uint32), POINTER(c_int32)]
_libfpga.read_FIFO_AI0.restype = None
values = (c_int16*size)()
_libfpga.read_FIFO_AI0(byref(values),size,byref(session),byref(status))
return values
Run Code Online (Sandbox Code Playgroud)
代码执行但我在数组中得到错误的结果.当我尝试在CI中使用C函数时获得正确的结果:
size_t size=20;
int16_t* input;
read_FIFO_AI0(&input, size, &session, &status);
Run Code Online (Sandbox Code Playgroud)
填充数组的正确方法是什么,以便我可以在Python中访问数据?我没有依赖于使用指向已填充的数组的指针,我也可以在C函数中创建数组并将其作为返回Python发送,但我也没有开始工作.
我正在开发一个项目,我希望在Python中执行数据采集,数据处理和GUI可视化(使用pyqt with pyqtgraph).原则上实现了每个部件,但是不同的部件没有很好地分开,这使得难以进行基准测试和改进性能.所以问题是:
有没有一种很好的方法来处理软件不同部分之间的大量数据?
我想到类似以下情况:
当我说"大量数据"时,我的意思是我得到的数据每秒大约有200万个数据点(16位),需要处理并可能也存储.
是否有任何Python框架可以用来正确处理大量数据?也许是我可以连接到的数据服务器的形式.
我正在使用 h5py 将实验数据存储在 HDF5 容器中。
在交互式会话中,我使用以下命令打开文件:
measurement_data = h5py.File('example.hdf5', 'a')
Run Code Online (Sandbox Code Playgroud)
然后我使用一些自己编写的函数将数据写入文件(可以是几天实验中的许多 GB 数据)。在实验结束时,我通常会使用
measurement_data.close()
Run Code Online (Sandbox Code Playgroud)
不幸的是,有时会发生交互式会话在没有我明确关闭文件的情况下结束(意外终止会话、断电、由于某些其他软件导致操作系统崩溃)。这总是会导致文件损坏和完整数据丢失。当我尝试打开它时,出现错误:
OSError: Unable to open file (File signature not found)
Run Code Online (Sandbox Code Playgroud)
我也无法在 HDFview 或我尝试过的任何其他软件中打开该文件。
每次写访问时总是打开和关闭文件对我来说听起来很不利,因为我不断地从许多不同的函数和线程写入数据。所以我会更满意不同的解决方案。
当试图把一个大ndarray的Queue放入一个Process,我遇到以下问题:
首先,这是代码:
import numpy
import multiprocessing
from ctypes import c_bool
import time
def run(acquisition_running, data_queue):
while acquisition_running.value:
length = 65536
data = numpy.ndarray(length, dtype='float')
data_queue.put(data)
time.sleep(0.1)
if __name__ == '__main__':
acquisition_running = multiprocessing.Value(c_bool)
data_queue = multiprocessing.Queue()
process = multiprocessing.Process(
target=run, args=(acquisition_running, data_queue))
acquisition_running.value = True
process.start()
time.sleep(1)
acquisition_running.value = False
process.join()
print('Finished')
number_items = 0
while not data_queue.empty():
data_item = data_queue.get()
number_items += 1
print(number_items)
Run Code Online (Sandbox Code Playgroud)
如果我使用length=10左右,一切正常.我通过队列传输了9个项目.
如果我length=1000在我的计算机上增加process.join()块,虽然功能run() …
我有一个 Python 包,它的组织方式如下:
package
|- subpackage
| |- code.py
| |- window.ui
| ...
Run Code Online (Sandbox Code Playgroud)
在code.py我要访问的文件window.ui通过
PyQt4.uic.loadUi('window.ui', self)
Run Code Online (Sandbox Code Playgroud)
这个效果很好,如果我只是运行code.py与subpackage作为工作目录。但是,如果我从另一个工作目录导入包,则找不到此文件:
IOError: [Errno 2] No such file or directory: 'window.ui'
Run Code Online (Sandbox Code Playgroud)
我的问题:如何获取文件code.py所在目录的路径名,以便创建window.ui. 或者,我怎样才能最有效地访问文件window.ui.
我想使用C API将Labview FPGA中的数据发送到C函数.为了使数据传输同步,我执行以下操作:
1)输入:
2)在两个步骤中,我使用Labview中的连接数函数将这4个值打包到U64中(它确实是hi.lo).所以它基本上是:
((I16.I16).(I16.U16))
( U32 . U32 )
U64
Run Code Online (Sandbox Code Playgroud)
3)现在这个U64值被转移到C函数,它应该被解压缩,如下所示:
U64
( U32 . U32 )
((I16.I16).(I16.U16))
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何在C中处理拆包.在Labview中是否有类似"拆分号"功能的东西?如何确保所有部件都分配了正确的数据类型?