我有一个使用大量内存映射文件的进程。
问题是这些文件保存在物理内存中,即使机器内存不足,其他进程也需要这些内存。
我已经尝试使用SetProcessWorkingSetSize来限制进程工作集,但它没有帮助,进程的工作集不断增长超过最大值。
有没有更好的方法来限制进程的工作集?
我可以更改用于分页内存映射文件的 Windows 启发式方法吗?
是否可以用于将numpy.memmap基于磁盘的大型字符串数组映射到内存中?
我知道它可以用于浮点数等,但这个问题专门针对字符串。
我对固定长度和可变长度字符串的解决方案感兴趣。
该解决方案可以自由指定任何合理的文件格式。
我正在尝试Write<T>在MemoryMappedViewAccessor课堂上使用该功能。我T在这种情况下如下:
[StructLayout(LayoutKind.Explicit)]
public struct Message
{
public void AddString(string str)
{
if (stringContents == null)
stringContents = new byte[1024 * 10];
stringContents = Encoding.ASCII.GetBytes(str);
}
public string GetString()
{
if (stringContents == null)
return string.Empty;
return Encoding.ASCII.GetString(stringContents);
}
[FieldOffset(0)]
public byte[] stringContents;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我拨打电话时,例如:
//Initialized Elsewhere: MemoryMappedViewAccessor writer
Message messageAlreadyOnWire = new Message();
messageAlreadyOnWire.AddString(data);
writer.Write<Message>(0, ref messageAlreadyOnWire);
Run Code Online (Sandbox Code Playgroud)
我收到如下错误:
指定的类型必须是不包含引用的结构。参数名称:类型
我的结构中唯一的“引用”是一个字节数组。有没有办法解决这个问题?我对固定长度的字节数组没问题,但我不确定如何在不深入研究 的情况下声明一个unsafe,我不想这样做。
我mmap在绘图应用程序中使用iOS上的功能.我有一个使用的文件,mmap然后我CGBitmapContext从该内存创建一个.用户可以CGBitmapContext用手指对其执行许多核心图形操作,这将导致存储器不断更新.
这种情况多久会冲到闪存存储器中,这是否会导致闪存存储器耗尽或性能下降?我没有注意到我的测试中有任何不好的事情,但我不太熟悉,mmap无法确切知道.
我正在尝试实现自定义allocator以将内存映射文件存储在std::vector. 执行的文件映射boost::iostreams::mapped_file
文件内存映射的分配器类型:
template<typename T>
class mmap_allocator
{
public:
typedef T value_type;
mmap_allocator(const std::string& filename)
: _mmfile(filename) { }
T* allocate (size_t n)
{
return reinterpret_cast<T*>(_mmfile.data());
}
void deallocate (T* p, size_t n)
{
p = nullptr;
_mmfile.close();
}
private:
boost::iostreams::mapped_file _mmfile;
};
Run Code Online (Sandbox Code Playgroud)
内存映射文件的容器,基于std::vector:
//Get file size
long GetFileSize(std::string filename)
{
FILE *p_file = NULL;
p_file = fopen(filename.c_str(),"rb");
fseek(p_file,0,SEEK_END);
int size = ftell(p_file);
fclose(p_file);
return size;
}
template<typename T>
class mm_vector : public …Run Code Online (Sandbox Code Playgroud) 我需要在嵌入式 Linux(2.6.37) 中尽可能快地将传入的 DMA 缓冲区写入到 HD 分区作为原始设备 /dev/sda1。缓冲区按要求对齐,长度相等,为 512KB。该过程可能会持续很长时间并填充多达例如 256GB 的数据。我需要使用内存映射文件技术(O_DIRECT 不适用),但无法理解如何执行此操作的确切方法。所以,在伪代码“正常”写作中:
fd=open(/dev/sda1",O_WRONLY);
while(1) {
p = GetVirtualPointerToNewBuffer();
if (InputStopped())
break;
write(fd, p, BLOCK512KB);
}
Run Code Online (Sandbox Code Playgroud)
现在,我将非常感谢如何利用内存映射技术编写本文的类似伪/真实代码示例。
UPDATE2:感谢 kestasx,最新的工作测试代码如下所示:
#define TSIZE (64*KB)
void* TBuf;
int main(int argc, char **argv) {
int fdi=open("input.dat", O_RDONLY);
//int fdo=open("/dev/sdb2", O_RDWR);
int fdo=open("output.dat", O_RDWR);
int i, offs=0;
void* addr;
i = posix_memalign(&TBuf, TSIZE, TSIZE);
if ((fdo < 1) || (fdi < 1)) {
printf("Error in files\n");
return -1; }
while(1) {
addr = mmap((void*)TBuf, TSIZE, PROT_READ …Run Code Online (Sandbox Code Playgroud) 我正在使用大约的内存映射文件.100 GB的数据.当我调用CreateViewStream该文件时,它需要30分钟来创建它,并且似乎是因为内存映射文件的大小,但是,为什么要花这么长时间呢?它是否将整个文件复制到托管内存中?
使用文件流编写文件并在不重新启动的情况下访问它需要更长的时间.(奇怪)
内存映射文件是使用正则表达式或对大型二进制文件进行操作的有效方法。
如果我有一个大文本文件 (~1GB),是否可以使用编码感知映射文件?
正则表达式[\u1234-\u5678]对bytes对象不起作用,将模式转换为 unicode 也不起作用("[\u1234-\u5678]".encode("utf-32") 例如无法正确理解范围)。
如果我将搜索模式从 转换str为bytes使用,搜索可能会起作用.encode()但它仍然有些限制,应该有一种更简单的方法,而不是整天解码和编码。
我试过用io.TextIOWrapper里面包裹它io.BufferedRandom但无济于事:
AttributeError: 'mmap.mmap' object has no attribute 'seekable'
Run Code Online (Sandbox Code Playgroud)
创建包装器(使用继承)并设置方法seekable,readable并writable返回True也不起作用。
关于编码,一个固定长度的编码,如utf-32,代码点或较低的 BMPutf-16可能会假设(如果甚至可能仅指该部分)。
欢迎使用任何 python 版本的解决方案。
我正在为DNG / TIFF文件编写读写器。一般而言FileInputStream,有几种处理文件的选项(FileChannel,RandomAccessFile),我不知道哪个策略是适合我的需要。
DNG / TIFF文件由以下内容组成:
整个文件的大小范围从15 MiB(压缩的14位原始数据)到大约100 MiB(未压缩的浮点数据)。要处理的文件数为50-400。
有两种使用模式:
我目前正在使用,FileChannel并执行map()来获取MappedByteBuffer覆盖整个文件的信息。如果我只想读取元数据,这似乎很浪费。另一个问题是释放映射的内存:当我四处传递映射缓冲区的切片以进行解析等时,底层MappedByteBuffer将不会收集。
我现在决定FileChannel使用几种read()方法复制较小的块,并仅映射大的原始数据区域。缺点是读取单个值似乎非常复杂,因为没有readShort()诸如此类:
short readShort(long offset) throws IOException, InterruptedException {
return read(offset, Short.BYTES).getShort();
}
ByteBuffer read(long offset, long byteCount) throws IOException, InterruptedException {
ByteBuffer buffer = ByteBuffer.allocate(Math.toIntExact(byteCount));
buffer.order(GenericTiffFileReader.this.byteOrder);
GenericTiffFileReader.this.readInto(buffer, offset);
return buffer;
}
private void readInto(ByteBuffer buffer, long startOffset)
throws IOException, InterruptedException {
long offset …Run Code Online (Sandbox Code Playgroud) 进入/proc/PID/maps我可以看到一些缓冲区映射到内核模块的内存:
44a00000-44b00000 rwxs 00000000 00:01 XXXX /dev/my_module
我知道它是逻辑地址,我想用dd?
dd 需要获取物理内存地址,我如何计算这个缓冲区的物理地址来转储它?