How do you avoid unnecessary copies when modifying table objects?
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
I'd like to avoid the performance cost of copying large amounts of data inside of tables. For example, if I wanted to add or remove columns from the table via a function, how would you do that without it creating a copy? Do you need to use handle classes or can this be acheived with the built-in tables?
채택된 답변
I think adding and removing columns from tables is largely like adding/removing elements from cell vectors, i.e., it involves no data copying.
댓글 수: 7
Matt is correct. Copying arrays in MATLAB is very fast because MATLAB arrays have copy-on-write semantics. See the following documentation page for more information.
If I wanted to add or remove columns from the table via a function, how would you do that without it creating a copy?
Using the documented workflows for manipulating tables should be fast. For example,
Letter = ["a";"b";"c"];
T = table(Letter)
T = 3×1 table
Letter
______
"a"
"b"
"c"
% Add a variable to T.
Number = [1;2;3];
T = addvars(T,Number,'Before','Letter')
T = 3×2 table
Number Letter
______ ______
1 "a"
2 "b"
3 "c"
% Remove a variable from T.
T = removevars(T,'Letter')
T = 3×1 table
Number
______
1
2
3
Please let me know if you have encountered any workflows where table operations are not fast enough and I can provide some suggestions.
Thanks for the replies. Just so I fully understand, is no copy generated because the assigned output variable is the same as the input one? My understanding of the copy-on-write behavior is that functions that modify the input value, like addvars and removars, should create a copy. @Seth Furman
One way to see that deleting columns doesn't allocate any new memory is with the test below. You can see that "Memory used by Matlab" has not changed, even after the creation of a copy T2 of table T1 with one fewer variables,
>> T1=array2table(rand(1e4));
>> memory
Maximum possible array: 4588 MB (4.811e+09 bytes) *
Memory available for all arrays: 4588 MB (4.811e+09 bytes) *
Memory used by MATLAB: 3458 MB (3.626e+09 bytes)
Physical Memory (RAM): 16250 MB (1.704e+10 bytes)
* Limited by System Memory (physical + swap file) available.
>> T2=T1(:,1:end-1);
>> memory
Maximum possible array: 4583 MB (4.805e+09 bytes) *
Memory available for all arrays: 4583 MB (4.805e+09 bytes) *
Memory used by MATLAB: 3458 MB (3.626e+09 bytes)
Physical Memory (RAM): 16250 MB (1.704e+10 bytes)
* Limited by System Memory (physical + swap file) available.
Thanks for providing that test! I see it's not making a copy.
A table is a container variable. It contains a number of components, each of which has its own type/size header, and its own data pointer. When you create a copy of a table that does not have one of the variables, then the type/size/data-pointer information is copied, without making a deep copy of the data. In C/C++ talk, tables contain a pointer to the data and copies of the tables copy the pointers (except that there is a reference count so that MATLAB can tell whether it needs to make a copy of the data when the data is eventually modified.)
Thanks for providing that test! I see it's not making a copy.
You're quite welcome. If your question is resolved, though, please Accept-click the answer.
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 Logical에 대해 자세히 알아보기
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
