Bộ đệm nội bộ trong python là gì

❮ Phương thức tệp


Ví dụ

Bạn có thể xóa bộ đệm khi ghi vào tệp

f = open("tệp của tôi. txt", "a")
f. write("Bây giờ tệp có thêm một dòng. ")
f. tuôn ra()
f. viết(". và một cái khác. ")

Chạy ví dụ »


Định nghĩa và cách sử dụng

Phương pháp flush() dọn sạch bộ đệm bên trong


cú pháp

Giá trị tham số

Không có tham số


❮ Phương thức tệp


Bộ đệm tệp trong Python. Trong hàm open() dựng sẵn, có một đối số tùy chọn, được gọi là đệm. Đối số này được sử dụng để chỉ định kích thước bộ đệm mong muốn của tệp i. e

  • 1. dòng đệm
  • 0. không có bộ đệm
  • bất kỳ giá trị dương nào khác. một bộ đệm có kích thước đó tính bằng byte
  • giá trị âm. sử dụng mặc định hệ thống thường được lưu vào bộ đệm dòng cho các thiết bị tty (máy đánh chữ từ xa) và được lưu vào bộ đệm đầy đủ cho các tệp khác. Đây là giá trị mặc định của đối số đệm

Chúng tôi sẽ xem xét chi tiết bộ đệm sau đoạn mã này

>>> fh1 = open('coding.py', 'r', 1)
>>> fh1.line_buffering				
True
>>> contents = fh1.buffer			 
>>> for line in contents:
	print(line)

# OUTPUT	
b'# -*- coding: utf-8 -*-\r\n'
b"variableOne = 'Ethan'\r\n"
b'print(variableOne)\r\n'
>>> fh1.close()



>>> fh1 = open('coding.py', 'r', 0)
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    fh1 = open('coding.py', 'r', 0)
ValueError: can't have unbuffered text I/O
>>> fh1.close()




>>> fh1 = open('coding.py', 'r', 5)
>>> fh1.line_buffering
False
>>> contents = fh1.buffer
>>> for line in contents:
	print(line)

	
b'# -*- coding: utf-8 -*-\r\n'
b"variableOne = 'Ethan'\r\n"
b'print(variableOne)\r\n'
>>> fh1.close()







>>> fh1 = open('coding.py', 'r', -1)
>>> fh1.line_buffering
False
>>> contents = fh1.buffer
>>> for line in contents:
	print(line)

	
b'# -*- coding: utf-8 -*-\r\n'
b"variableOne = 'Ethan'\r\n"
b'print(variableOne)\r\n'
>>> fh1.close()

Bộ đệm lưu trữ một đoạn dữ liệu từ luồng tệp của Hệ điều hành cho đến khi nó được sử dụng hết, tại thời điểm đó, nhiều dữ liệu hơn sẽ được đưa vào bộ đệm. Lý do tốt để sử dụng bộ đệm là tương tác với luồng thô có thể có độ trễ cao. e. mất nhiều thời gian để lấy dữ liệu từ nó và cũng để ghi vào nó. Hãy lấy một ví dụ

Giả sử bạn muốn đọc 100 ký tự từ một tệp cứ sau 2 phút qua mạng. Thay vì cố đọc từ luồng tệp thô cứ sau 2 phút, tốt hơn là tải một phần của tệp vào bộ đệm trong bộ nhớ và sau đó sử dụng nó khi thời gian thích hợp. Sau đó, phần tiếp theo của tệp sẽ được tải vào bộ đệm, v.v.

Lưu ý rằng kích thước của bộ đệm sẽ phụ thuộc vào tốc độ tiêu thụ dữ liệu. Đối với ví dụ trên, 100 ký tự được yêu cầu sau 2 phút. Vì vậy, bất cứ thứ gì nhỏ hơn 100 sẽ dẫn đến tăng độ trễ, bản thân 100 sẽ hoạt động tốt và bất cứ thứ gì hơn một trăm sẽ tăng lên

Một lý do khác để sử dụng bộ đệm là nó có thể được sử dụng để đọc các tệp lớn (hoặc tệp có kích thước không chắc chắn), mỗi lần một đoạn. Trong khi xử lý các tệp, có thể đôi khi bạn không chắc chắn về kích thước của tệp mà bạn đang cố đọc. Giả sử, trong một trường hợp cực kỳ khó xảy ra, nếu kích thước tệp lớn hơn bộ nhớ máy tính, nó sẽ gây ra sự cố cho bộ xử lý của máy tính của bạn. Do đó, việc chủ động xác định kích thước tối đa có thể đọc được luôn được coi là một lựa chọn an toàn. Bạn có thể sử dụng nhiều lần cài đặt bộ đệm để đọc và thao tác với toàn bộ tệp, như minh họa bên dưới

# The following code snippet reads a file containing 196 bytes, with a buffer of 20 bytes, and writes to a file, 20 bytes at a time.
# A practical example will have large-scale values of buffer and file size.
buffersize = 20			                    # maximum number of bytes to be read in one instance
inputFile = open('fileToBeReadFrom.txt', 'r')       
outputFile = open('fileToBeWrittenInto.txt', 'a')   # opening a file in append mode; creates a file if it doesn't exist
buffer = inputFile.read(buffersize)		    # buffer contains data till the specified cursor position

# Writing the contents of a buffer another file 20 bytes at a time
counter = 0		                            # a counter variable for us to see the instalments of 20 bytes						
while len(buffer):
    counter = counter + 1
    outputFile.write(buffer)
    print( str(counter) + " ")
    buffer = inputFile.read(buffersize)		    # next set of 20 bytes from the input file

outputFile.close()
inputFile.close()

Trong thực tế, có hai loại bộ đệm

  • Bộ đệm nội bộ
  • Bộ đệm hệ điều hành

Bộ đệm bên trong được tạo bởi ngôn ngữ hoặc thư viện thời gian chạy mà bạn đang sử dụng, với mục đích tăng tốc mọi thứ, bằng cách ngăn các cuộc gọi hệ thống cho mọi thao tác ghi. Vì vậy, khi bạn ghi vào một tệp, bạn ghi vào bộ đệm của nó và bất cứ khi nào bộ đệm đầy, có thể nói như vậy, dữ liệu được ghi vào tệp thực tế bằng cách sử dụng các lệnh gọi hệ thống. Điều đó nói rằng, do bộ đệm của hệ điều hành, điều này không nhất thiết có nghĩa là dữ liệu được ghi vào chính tệp đó. Điều đó có thể có nghĩa là dữ liệu đã được sao chép từ bộ đệm bên trong vào bộ đệm Hệ điều hành

Vì vậy, khi bạn thực hiện thao tác ghi, dữ liệu vẫn chỉ nằm trong bộ đệm cho đến khi đóng tệp và nếu máy của bạn bị ngắt nguồn, dữ liệu sẽ không có trong tệp. Để giúp bạn điều này, có 2 hàm trong Python. tập tinHandler. tuôn ra () và hệ điều hành. fsync(fileHandler) trong đó os là mô-đun được nhập để thực hiện các tác vụ của hệ điều hành

flush() ghi dữ liệu từ bộ đệm bên trong vào bộ đệm hệ điều hành mà không cần phải đóng nó. Điều này có nghĩa là nếu một quá trình khác đang thực hiện thao tác đọc từ cùng một tệp, nó sẽ có thể đọc dữ liệu mà bạn vừa xóa vào tệp. Tuy nhiên, điều này không nhất thiết có nghĩa là dữ liệu đã được ghi vào tệp, nó có thể hoặc không thể. Để đảm bảo điều này, hệ điều hành. Hàm fsync(fileHandler) cần được gọi để sao chép dữ liệu từ bộ đệm của hệ điều hành vào tệp

Nếu bạn không chắc liệu những gì bạn đang cố gắng viết có thực sự được viết khi bạn nghĩ rằng nó đang được viết hay không, bạn có thể sử dụng các lệnh gọi hàm này theo cách bên dưới

>>> fh = open('fileToBeWrittenInto.txt', 'w+')
>>> fh.write('Output line # 1')
15
>>> fh.write('\n')
1
# open the file in a text editor, you will not see any data in it.
>>> fh.flush()
# re-open the file in a text editor, you will see the contents as below:
# Contents of fileToBeWrittenInto.txt
Output line # 1

# This data can now be read by any other process attempting to read it.
>>> fh.write('Output line # 2')
# open the file in a text editor, you will see the contents as below:
# Contents of fileToBeWrittenInto.txt
Output line # 1

>>> fh.flush()
# open the file in a text editor, you will see the contents as below:
# Contents of fileToBeWrittenInto.txt
Output line # 1
Output line # 2
>>> fh.close()

Đừng hiểu lầm rằng write() không thực sự 'ghi' dữ liệu vào một tệp, nhưng chỉ khi close() được gọi. Nói cách khác, phương thức close() xóa dữ liệu vào tệp trước khi đóng tệp. Nếu bạn muốn ghi vào một tệp mà không cần phải đóng nó, bạn có thể sử dụng phương thức flush()

# Using the fsync(fileHandler) function.
>>> fh = open('fileToBeWrittenInto2.txt', 'w+')
>>> fh.write('Output line # 1')
15
>>> fh.write('\n')
1
# open file in text-editor, it will be empty.
>>> fh.flush()
# open file in text-editor, it will have the following contents
# Contents of fileToBeWrittenInto2.txt
Output line # 1

>>> fh.write('Output line # 2')
15
# check file contents, they will be unchanged as flush() hasn't been called yet
# Contents of fileToBeWrittenInto2.txt
Output line # 1

# Now let's use the fsync() function 
>>> import os
>>> help(os.fsync)
Help on built-in function fsync in module nt:

fsync(...)
    fsync(fildes)
    
    force write of file with filedescriptor to disk.

>>> os.fsync(fh)
# check file contents, they will be unchanged. As we know, fsync() copies data from operating system buffers to file( i.e. in the disk). In this case, there is no pending data in the operating system buffers because flush has not been called. Once flush() is called, the data will be in operating system buffers which may or may not copy data to the file. If it is not copied, then fsync() will force the write to the file when it is called.
# Contents of fileToBeWrittenInto2.txt
Output line # 1

>>> fh.flush()
# check file contents
# Contents of fileToBeWrittenInto2.txt
Output line # 1
Output line # 2


>>> fh.close()

# In this interactive example, we can see that as soon as flush() is called, the data is being written to the file itself, so we don't really feel the need of fsync() right now. But in a script containing hundreds of lines, it is not viable to check the contents of file after each statement, so it is safe to call the fsync(fileHandler) function, to err on the side of caution.

Kích thước bộ đệm mặc định

Bạn có thể kiểm tra kích thước bộ đệm mặc định của nền tảng của mình bằng cách nhập mô-đun io và kiểm tra thuộc tính DEFAULT_BUFFER_SIZE của nó. Kích thước được trả về tính bằng byte

Bộ đệm nội bộ là gì?

"Bộ đệm trong" là không gian lưu trữ tạm thời để lưu trữ dữ liệu dự định ghi vào bộ nhớ chính , có thể được .

Bộ đệm có nghĩa là gì trong Python?

Cấu trúc bộ đệm (hoặc đơn giản là “bộ đệm”) hữu ích vì một cách để hiển thị dữ liệu nhị phân từ một đối tượng khác cho lập trình viên Python . Chúng cũng có thể được sử dụng như một cơ chế cắt không sao chép. Sử dụng khả năng tham chiếu một khối bộ nhớ của họ, có thể hiển thị bất kỳ dữ liệu nào cho lập trình viên Python khá dễ dàng.

Kích thước bộ đệm trong Python là gì?

Kích thước của bộ đệm được chọn tùy thuộc vào “kích thước khối” của thiết bị bên dưới. Trên nhiều hệ thống, bộ đệm thường dài 4096 hoặc 8192 byte .

Bộ đệm trong lập trình là gì?

Bộ đệm là một vùng bộ nhớ được sử dụng để tạm thời giữ dữ liệu trong khi dữ liệu được di chuyển từ nơi này sang nơi khác . Bộ đệm được sử dụng khi di chuyển dữ liệu giữa các quy trình trong máy tính.