我在java中构造一个字节数组,我不知道数组会有多长.
我想要一些像Java的StringBuffer这样的工具你可以调用.append(字节b)或.append(byte [] buf)并让它缓冲我的所有字节并在完成后返回给我一个字节数组.是否有一个类用于StringBuffer为字符串做什么?它看起来不像我正在寻找的ByteBuffer类.
谁有一个很好的解决方案?
有关类型化内存视图的Cython文档列出了三种分配给类型化内存视图的方法:
np.ndarray和cython.view.array.假设我没有从外部传入我的cython函数的数据,而是想分配内存并将其作为a返回np.ndarray,我选择了哪些选项?还假设该缓冲区的大小不是编译时常量,即我不能在堆栈上分配,但需要malloc选项1.
因此,3个选项可以解释如下:
from libc.stdlib cimport malloc, free
cimport numpy as np
from cython cimport view
np.import_array()
def memview_malloc(int N):
cdef int * m = <int *>malloc(N * sizeof(int))
cdef int[::1] b = <int[:N]>m
free(<void *>m)
def memview_ndarray(int N):
cdef int[::1] b = np.empty(N, dtype=np.int32)
def memview_cyarray(int N):
cdef int[::1] b = view.array(shape=(N,), itemsize=sizeof(int), format="i")
Run Code Online (Sandbox Code Playgroud)
让我感到惊讶的是,在所有三种情况下,Cython为内存分配生成了大量代码,特别是调用__Pyx_PyObject_to_MemoryviewSlice_dc_int.这表明(我可能在这里错了,我对Cython内部工作的洞察力非常有限),它首先创建一个Python对象,然后将其"转换"到内存视图中,这似乎是不必要的开销.
一个简单的基准测试并未揭示三种方法之间存在很大差异,其中2是最薄弱的方法.
推荐三种方法中的哪一种?或者有更好的选择吗? …
字节数组和字节缓冲区有什么区别?
此外,在什么情况下应该优先于另一个?
[我的用例是用于在java中开发的Web应用程序].
我对Buffers和ReadableStreams很新,所以这可能是一个愚蠢的问题.我有一个库作为ReadableStream的输入,但我的输入只是一个base64格式的图像.我可以像这样转换Buffer中的数据:
var img = new Buffer(img_string, 'base64');
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将其转换为ReadableStream或将我获得的Buffer转换为ReadableStream.
有没有办法做到这一点,还是我试图实现不可能的?
谢谢.
在Python中,您可以将StringIO用于字符数据的类文件缓冲区.内存映射文件基本上对二进制数据做类似的事情,但它需要一个用作基础的文件.Python是否有一个用于二进制数据的文件对象,并且只是内存,相当于Java的ByteArrayOutputStream?
我的用例是我想在内存中创建一个ZIP文件,ZipFile需要一个类似文件的对象.
我正在使用log4net和AdoNetAppender.似乎AdoNetAppender有一个Flush方法.无论如何我可以从我的代码中调用它吗?
我正在尝试创建一个管理页面来查看数据库日志中的所有条目,我想用bufferSize = 100(或更多)设置log4net,然后我希望管理员能够单击管理员上的按钮页面强制log4net将缓冲的日志条目写入数据库(不关闭log4net).
那可能吗?
我测试了两种写入配置:
1)Fstream缓冲:
// Initialization
const unsigned int length = 8192;
char buffer[length];
std::ofstream stream;
stream.rdbuf()->pubsetbuf(buffer, length);
stream.open("test.dat", std::ios::binary | std::ios::trunc)
// To write I use :
stream.write(reinterpret_cast<char*>(&x), sizeof(x));
Run Code Online (Sandbox Code Playgroud)
2)手动缓冲:
// Initialization
const unsigned int length = 8192;
char buffer[length];
std::ofstream stream("test.dat", std::ios::binary | std::ios::trunc);
// Then I put manually the data in the buffer
// To write I use :
stream.write(buffer, length);
Run Code Online (Sandbox Code Playgroud)
我期待同样的结果......
但是我的手动缓冲可以将性能提高10倍来写入100MB的文件,并且与正常情况相比,fstream缓冲不会改变任何东西(不重新定义缓冲区).
有人对这种情况有解释吗?
编辑:这是新闻:刚刚在超级计算机上完成的基准测试(Linux 64位架构,持续英特尔至强8核,Lustre文件系统和...希望配置良好的编译器)
(我没有解释1kB手动缓冲器"共振"的原因......)
编辑2:在1024 B的共振(如果有人对此有所了解,我很感兴趣):

字节缓冲区应该是char或unsigned char还是char缓冲区?C和C++之间有什么区别?
谢谢.