- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 while 循环中从 UDP 套接字读取数据。我需要最有效的方法
1)读取数据(*)(这有点解决了,但感谢评论)
2)定期将(操纵的)数据转储到文件中(**)(问题)
我预计 numpy 的“tostring”方法会出现瓶颈。让我们考虑以下一段(不完整的)代码:
import socket
import numpy
nbuf=4096
buf=numpy.zeros(nbuf,dtype=numpy.uint8) # i.e., an array of bytes
f=open('dump.data','w')
datasocket=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ETC.. (code missing here) .. the datasocket is, of course, non-blocking
while True:
gotsome=True
try:
N=datasocket.recv_into(buf) # no memory-allocation here .. (*)
except(socket.error):
# do nothing ..
gotsome=False
if (gotsome):
# the bytes in "buf" will be manipulated in various ways ..
# the following write is done frequently (not necessarily in each pass of the while loop):
f.write(buf[:N].tostring()) # (**) The question: what is the most efficient way to do this?
f.close()
最佳答案
基本上,听起来你想使用数组的 tofile
方法或直接使用ndarray.data
缓冲对象。
对于您的确切用例,使用数组的 data
缓冲区是最有效的,但是对于一般用途,您需要注意很多警告。我稍后会详细说明。
但是,首先让我回答您的几个问题并提供一些说明:
buf[:N]
allocates memory for a new array object, having the length N+1, right?
y = buf[:N]
所做的任何更改会影响
buf
也是。
buf[:N].tostring() allocates memory for a new string, and the bytes from buf are copied into this string
somestring = 'This could be a big string'
arr = np.frombuffer(buffer(somestring), dtype=np.uint8)
arr
将是只读的。
Is there a way to just tell f.write to access directly the memory address of "buf" from 0 to N bytes and write them onto the disk?
f.write(buf[:N].data)
N
将在数组中的项目中,而不是直接以字节为单位。它们在您的示例代码中是等效的(由于
dtype=np.int8
或任何其他 8 位数据类型)。
f.write(buf.data[:N])
arr.data
buffer 将分配一个新的字符串,所以它在功能上类似于
buf[:N].tostring()
.无论如何,请注意
f.write(buf[:N].tostring())
不同于做
f.write(buf.data[:N])
对于大多数 dtypes,但两者都会分配一个新字符串。
somearr.data
由于这个原因,可能会导致惊喜。
x = np.arange(10, dtype=np.uint8)
y = x[::2]
y
与
x
共享相同的内存缓冲区,但它在内存中并不连续(查看
x.flags
与
y.flags
)。相反,它引用
x
中的所有其他项目的内存缓冲区(比较
x.strides
和
y.strides
)。
y.data
,我们会得到一个错误,告诉我们这不是内存中的连续数组,我们无法为它获取单段缓冲区:
In [5]: y.data
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-54-364eeabf8187> in <module>()
----> 1 y.data
AttributeError: cannot get single-segment buffer for discontiguous array
tofile
的很大一部分原因。方法(它也早于 python 的
buffer
s,但这是另一回事)。
tofile
将数组中的数据写入文件而不分配额外的内存。但是,因为它是在 C 级实现的,所以它只适用于真正的
file
对象,而不是类似文件的对象(例如套接字、StringIO 等)。
buf[:N].tofile(f)
buf[someslice].tofile(f)
arr.data
稍慢缓冲区并直接将其写入磁盘。
ndarray.tofile
方法将比
f.write(arr.tostring())
更有效.
关于python - 将 Python 中的字节从 Numpy 数组复制到字符串或字节数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28341785/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!