Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用BufferedWriter?_Python_File_Buffer_Bufferedwriter - Fatal编程技术网

如何在Python中使用BufferedWriter?

如何在Python中使用BufferedWriter?,python,file,buffer,bufferedwriter,Python,File,Buffer,Bufferedwriter,我面临以下问题:我正试图实现一个供应链模拟器。这些将产生大量EPCIS事件(发生在RFID读卡器上的事件)。然后,应将这些事件写入csv文件,以便将其加载到任何数据库中并对其运行分析算法 模拟器是使用python实现的,运行良好。我现在要做的是将事件缓冲写入文件,以减少访问磁盘所需的时间。浏览python文档时,我偶然发现了io.BufferedWriter,它听起来和我要找的东西一模一样。不管怎么说,我不能让它正常工作 以下是我到目前为止所做的。我实现了我的CsvWriter类,该类继承自Ra

我面临以下问题:我正试图实现一个供应链模拟器。这些将产生大量EPCIS事件(发生在RFID读卡器上的事件)。然后,应将这些事件写入csv文件,以便将其加载到任何数据库中并对其运行分析算法

模拟器是使用python实现的,运行良好。我现在要做的是将事件缓冲写入文件,以减少访问磁盘所需的时间。浏览python文档时,我偶然发现了io.BufferedWriter,它听起来和我要找的东西一模一样。不管怎么说,我不能让它正常工作

以下是我到目前为止所做的。我实现了我的
CsvWriter
类,该类继承自RawIOBase并管理文件句柄。当它被实例化时,它将创建一个
BufferedWriter
,并将自身作为
raw
参数(这可能已经是一个问题了?)

当我知道要写什么东西时,我称之为
write\u buffered
buffered,如下所示:

def write_buffered(self, data_dict):    
        self.buffer.write(b';'.join(map(str, data_dict.values())) + '\n')
def write(self, data):
        if self.file.closed:
            self.file = self.openFile()

        return self.file.write(data)
实际的
write
方法(如我所示)需要在
CsvWriter
类本身上实现,如下所示:

def write_buffered(self, data_dict):    
        self.buffer.write(b';'.join(map(str, data_dict.values())) + '\n')
def write(self, data):
        if self.file.closed:
            self.file = self.openFile()

        return self.file.write(data)
问题是,当我尝试运行模拟器时,会出现以下错误:

IOError: raw write() returned invalid length -1 (should have been between 0 and 78)

你们有谁能告诉我如何解决这个问题吗?

通常,文件I/O(例如,
open
)应该已经被缓冲了(
open(…)
给了我一个
缓冲的{Reader,Writer}
实例),底层的C库可能有一个缓冲区,操作系统可能有一个缓冲区,磁盘可能有一个缓存。您真的需要自己添加什么吗?好的,但在写入磁盘之前,这会使用尽可能多的RAM吗?这基本上就是我想要实现的。在进行写操作之前,请在内存中保留尽可能多的内存。您可以在
打开文件时指定所需的缓冲区大小(第三个参数)。如果您只有基本需求,则无需创建自己的缓冲区。注意:如果不指定尺寸,将使用系统默认值,一些医生。