<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Thâm Davies, Author at Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/author/thamdavies/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/author/thamdavies/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Mon, 11 Dec 2023 09:51:56 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Thâm Davies, Author at Tomoshare</title>
	<link>https://blog.tomosia.com.vn/author/thamdavies/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Hiểu thêm về JSON trong Ruby</title>
		<link>https://blog.tomosia.com.vn/hieu-them-ve-json-trong-ruby/</link>
					<comments>https://blog.tomosia.com.vn/hieu-them-ve-json-trong-ruby/#comments</comments>
		
		<dc:creator><![CDATA[Thâm Davies]]></dc:creator>
		<pubDate>Mon, 11 Dec 2023 09:28:45 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[json in ruby]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2531</guid>

					<description><![CDATA[<p>Trong bài này mình muốn chia sẻ một vài thứ hay ho trong method JSON.parse trong Ruby. Let’s&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/hieu-them-ve-json-trong-ruby/">Hiểu thêm về JSON trong Ruby</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Trong bài này mình muốn chia sẻ một vài thứ hay ho trong method <code>JSON.parse</code> trong Ruby. Let’s jump in 👇</p>



<p>Trong Ruby, phương thức <code>JSON.parse</code> dùng để parse chuỗi JSON và chuyển đổi nó thành cấu trúc dữ liệu của Ruby, thường là hash hay array. Chúng ta cũng có thể truyền hai tham số là: <code>object_class</code> và <code>symbolize_names</code>.</p>



<ul class="wp-block-list">
<li>object_class: cho phép bạn chỉ định lớp sẽ được sử dụng để khởi tạo đối tượng cho JSON.</li>



<li>symbolize_names: nếu bạn truyền tham số <code>symbolize_names</code> với giá trị là true thì key của object sau khi parse là symbol chứ không phải string như mặc định</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://i.imgur.com/4hv0Gym.png" alt=""/></figure>



<p>Link code: <a href="https://gist.github.com/thamdavies/2780c45d214546caf8b1d83fb6c70e53">Gist</a></p>



<p>Bài viết gốc: <a href="https://www.thamdavies.com/blog/hieu-them-ve-json-trong-ruby">thamdavies.com</a></p>



<p>That’s it. Happy coding 💯</p>
<p>The post <a href="https://blog.tomosia.com.vn/hieu-them-ve-json-trong-ruby/">Hiểu thêm về JSON trong Ruby</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/hieu-them-ve-json-trong-ruby/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Async-IO, đa luồng và đơn luồng trong Javascript</title>
		<link>https://blog.tomosia.com.vn/async-io-da-luong-va-don-luong-trong-javascript/</link>
					<comments>https://blog.tomosia.com.vn/async-io-da-luong-va-don-luong-trong-javascript/#comments</comments>
		
		<dc:creator><![CDATA[Thâm Davies]]></dc:creator>
		<pubDate>Mon, 11 Dec 2023 01:36:12 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[async-io]]></category>
		<category><![CDATA[multi-threaded]]></category>
		<category><![CDATA[single-threaded]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2396</guid>

					<description><![CDATA[<p>Nếu bạn muốn trở thành lập trình viên JS chuyên nghiệp hoặc đang học JS, việc hiểu rõ&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/async-io-da-luong-va-don-luong-trong-javascript/">Async-IO, đa luồng và đơn luồng trong Javascript</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Nếu bạn muốn trở thành lập trình viên JS chuyên nghiệp hoặc đang học JS, việc hiểu rõ về I/O bất đồng bộ và sự khác biệt so với đa luồng là điều cực kì quan trọng.</p>



<p>Hãy cùng nhau xem xét cách một hoạt động đọc file blocking được thực hiện trong 3 trường hợp sau:</p>



<ul class="wp-block-list">
<li><strong>Đơn luồng (single-threaded):</strong>&nbsp;Chỉ xử lí được 1 công việc một lúc. Khi bắt đầu đọc file A, toàn bộ quy trình sẽ bị &#8220;đóng băng&#8221; cho đến khi hoàn tất. Lúc đó không thể đọc file B được.</li>



<li><strong>Đa luồng (multi-threaded):</strong>&nbsp;Khi luồng 1 bắt đầu đọc file A, chỉ riêng luồng 1 bị block, còn luồng 2 vẫn đọc được file B đồng thời.</li>



<li><strong>Đơn luồng với Async-IO (single-threaded with Async-IO):</strong>&nbsp;Khi gặp lệnh đọc file A, nó sẽ chuyển sang&nbsp;<a href="https://www.thamdavies.com/snippets/thread-pool-la-gi" target="_blank" rel="noreferrer noopener">thread pool</a>&nbsp;thực hiện. Luồng chính tiếp tục đọc file B. Khi xong sẽ trả kết quả về luồng chính bằng callback.</li>
</ul>



<p>Nhờ đó trang web không bị &#8220;đóng băng&#8221; khi thực hiện nhiều yêu cầu đồng thời như gọi hàm&nbsp;<code>fetch()</code></p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="480" height="270" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/cheers.gif" alt="" class="wp-image-2400"/></figure>
</div>


<p>Như vậy, chúng ta đã cùng nhau xét xem cách hoạt động đọc file blocking được thực hiện trong các mô hình đơn luồng, đa luồng và sử dụng thread pool. Việc nắm vững các khái niệm này giúp lập trình viên Javascript xử lý I/O hiệu quả, đảm bảo tính khả dụng và trải nghiệm người dùng. Enjoy coding 😘</p>



<p>Bài viết gốc: <a href="https://www.thamdavies.com/blog/async-io-da-luong-va-don-luong-trong-javascript">https://www.thamdavies.com/blog/async-io-da-luong-va-don-luong-trong-javascript</a></p>
<p>The post <a href="https://blog.tomosia.com.vn/async-io-da-luong-va-don-luong-trong-javascript/">Async-IO, đa luồng và đơn luồng trong Javascript</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/async-io-da-luong-va-don-luong-trong-javascript/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Cách xử lý CSV hiệu quả trong Ruby</title>
		<link>https://blog.tomosia.com.vn/cach-xu-ly-csv-hieu-qua-trong-ruby/</link>
					<comments>https://blog.tomosia.com.vn/cach-xu-ly-csv-hieu-qua-trong-ruby/#comments</comments>
		
		<dc:creator><![CDATA[Thâm Davies]]></dc:creator>
		<pubDate>Tue, 28 Nov 2023 06:03:39 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2064</guid>

					<description><![CDATA[<p>First things first Hey, bạn Thâm đây Như tiêu đề bài viết thì trong bài này mình sẽ&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-xu-ly-csv-hieu-qua-trong-ruby/">Cách xử lý CSV hiệu quả trong Ruby</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 id="first-things-first" class="wp-block-heading">First things first</h3>



<p>Hey, bạn Thâm đây</p>



<p>Như tiêu đề bài viết thì trong bài này mình sẽ thử nghiệm các cách để đọc file CSV, rồi chọn ra cách tối ưu nhất ở phương diện tiêu thụ RAM, cũng như tốc độ xử lý. Let’s go</p>



<h3 id="chuan-bi-file-test" class="wp-block-heading">Chuẩn bị file test</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="require 'csv'
require_relative './helpers'

headers   = ['id', 'name', 'email', 'city', 'street', 'country']

name      = &quot;Tham Davies&quot;
user_name = &quot;boygialaideptraikhongyeuai&quot;
email     = &quot;large-data@csv.com&quot;
city      = &quot;Pleiku&quot;
street    = &quot;Le Duan&quot;
country   = &quot;Viet Nam&quot;

print_memory_usage do
  print_time_spent do
    CSV.open('data.csv', 'w', write_headers: true, headers: headers) do |csv|
      1_000_000.times do |i|
        csv &lt;&lt; [i, name, user_name, email, city, street, country]
      end
    end
  end
end" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">require</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">csv</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F286C4">require_relative</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">./helpers</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">headers   </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">id</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">name</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">email</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">city</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">street</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">country</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">name      </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Tham Davies</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">user_name </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">boygialaideptraikhongyeuai</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">email     </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">large-data@csv.com</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">city      </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Pleiku</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">street    </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Le Duan</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">country   </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Viet Nam</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">print_memory_usage </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">  print_time_spent </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1; font-style: italic">CSV</span><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">open</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">data.csv</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">w</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, write_headers</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">, headers</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> headers) </span><span style="color: #F286C4">do</span><span style="color: #F6F6F4"> |csv|</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #BF9EEE">1_000_000</span><span style="color: #F6F6F4">.times </span><span style="color: #F286C4">do</span><span style="color: #F6F6F4"> |i|</span></span>
<span class="line"><span style="color: #F6F6F4">        csv </span><span style="color: #F286C4">&lt;&lt;</span><span style="color: #F6F6F4"> [i, name, user_name, email, city, street, country]</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F286C4">end</span></span></code></pre></div>



<h3 id="helpers" class="wp-block-heading">Helpers</h3>



<p>Tiếp theo, chúng ta sẽ sử dụng Benchmark để đo thời gian và đo lường việc sử dụng bộ nhớ.</p>



<ul class="wp-block-list">
<li><code>print_memory_usage</code> sẽ tính toán và in ra lượng bộ nhớ sử dụng trước và sau khi thực hiện các thao tác.</li>



<li><code>print_time_spent</code> sẽ tính toán và in ra thời gian thực hiện các thao tác.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="require 'benchmark'

def print_memory_usage
  memory_before = `ps -o rss= -p #{Process.pid}`.to_i
  yield
  memory_after = `ps -o rss= -p #{Process.pid}`.to_i

  puts &quot;Memory: #{((memory_after - memory_before) / 1024.0).round(2)} MB&quot;
end

def print_time_spent
  time = Benchmark.realtime do
    yield
  end

  puts &quot;Time: #{time.round(2)} seconds&quot;
end" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">require</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">benchmark</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">def</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">print_memory_usage</span></span>
<span class="line"><span style="color: #F6F6F4">  memory_before </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">`</span><span style="color: #E7EE98">ps -o rss= -p </span><span style="color: #F286C4">#{</span><span style="color: #97E1F1; font-style: italic">Process</span><span style="color: #E7EE98">.pid</span><span style="color: #F286C4">}</span><span style="color: #DEE492">`</span><span style="color: #F6F6F4">.to_i</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">yield</span></span>
<span class="line"><span style="color: #F6F6F4">  memory_after </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">`</span><span style="color: #E7EE98">ps -o rss= -p </span><span style="color: #F286C4">#{</span><span style="color: #97E1F1; font-style: italic">Process</span><span style="color: #E7EE98">.pid</span><span style="color: #F286C4">}</span><span style="color: #DEE492">`</span><span style="color: #F6F6F4">.to_i</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">puts</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Memory: </span><span style="color: #F286C4">#{</span><span style="color: #E7EE98">((memory_after </span><span style="color: #F286C4">-</span><span style="color: #E7EE98"> memory_before) </span><span style="color: #F286C4">/</span><span style="color: #E7EE98"> </span><span style="color: #BF9EEE">1024.0</span><span style="color: #E7EE98">).round(</span><span style="color: #BF9EEE">2</span><span style="color: #E7EE98">)</span><span style="color: #F286C4">}</span><span style="color: #E7EE98"> MB</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F286C4">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">def</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">print_time_spent</span></span>
<span class="line"><span style="color: #F6F6F4">  time </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Benchmark</span><span style="color: #F6F6F4">.realtime </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">yield</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">puts</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Time: </span><span style="color: #F286C4">#{</span><span style="color: #E7EE98">time.round(</span><span style="color: #BF9EEE">2</span><span style="color: #E7EE98">)</span><span style="color: #F286C4">}</span><span style="color: #E7EE98"> seconds</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F286C4">end</span></span></code></pre></div>



<p>Sau khi có 2 file trên thì các bạn chạy câu lệnh bên dưới để tiến hành tạo file test</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="$ ruby generate_csv.rb
Time: 3.61
Memory: 1.67 MB

$ ls -lah data.csv
-rw-r--r--@ 1 tham  tham    85M Nov 22 10:45 data.csv" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">$</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">ruby</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">generate_csv.rb</span></span>
<span class="line"><span style="color: #62E884">Time:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">3.61</span></span>
<span class="line"><span style="color: #62E884">Memory:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1.67</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">MB</span></span>
<span class="line"></span>
<span class="line"><span style="color: #62E884">$</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">ls</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">-lah</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">data.csv</span></span>
<span class="line"><span style="color: #62E884">-rw-r--r--@</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">tham</span><span style="color: #F6F6F4">  </span><span style="color: #E7EE98">tham</span><span style="color: #F6F6F4">    </span><span style="color: #BF9EEE">85</span><span style="color: #E7EE98">M</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">Nov</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">22</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">10</span><span style="color: #E7EE98">:45</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">data.csv</span></span></code></pre></div>



<p>Kết quả ở trên tuỳ thuộc vào máy, và điểm mấu chốt ở đây là Ruby sử dụng rất ít bộ nhớ (~1.7MB) để generate file CSV có kích thước là 85MB vì cơ chế dọn rác (GC) đã thu hồi lại bộ nhớ đã sử dụng.</p>



<h3 id="cac-cach-doc-file-csv" class="wp-block-heading">Các cách đọc file CSV</h3>



<p>1. <strong>CSV.read</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="require_relative './helpers'
require 'csv'

print_memory_usage do
  print_time_spent do
    csv = CSV.read('data.csv', headers: true)
    sum = 0

    csv.each do |row|
      sum += row['id'].to_i
    end
    puts &quot;Sum: #{sum}&quot;
  end
end
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">require_relative</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">./helpers</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F286C4">require</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">csv</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">print_memory_usage </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">  print_time_spent </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">    csv </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">CSV</span><span style="color: #F6F6F4">.read(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">data.csv</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, headers</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    sum </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    csv.each </span><span style="color: #F286C4">do</span><span style="color: #F6F6F4"> |row|</span></span>
<span class="line"><span style="color: #F6F6F4">      sum </span><span style="color: #F286C4">+=</span><span style="color: #F6F6F4"> row[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">id</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">].to_i</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">puts</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Sum: </span><span style="color: #F286C4">#{</span><span style="color: #E7EE98">sum</span><span style="color: #F286C4">}</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F286C4">end</span></span>
<span class="line"></span></code></pre></div>



<p>Kết quả:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="$ ruby parse1.rb
Sum: 499999500000
Time: 20.12
Memory: 894.5 MB
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">$</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">ruby</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">parse1.rb</span></span>
<span class="line"><span style="color: #62E884">Sum:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">499999500000</span></span>
<span class="line"><span style="color: #62E884">Time:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">20.12</span></span>
<span class="line"><span style="color: #62E884">Memory:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">894.5</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">MB</span></span>
<span class="line"></span></code></pre></div>



<p>Qoáo, cách này tiêu tốn 900MB RAM, mất 20S để đọc file, hãy thử tưởng tượng file của bạn tầm 10GB thì sẽ như thế nào 😄</p>



<p>Một số bạn sẽ thắc mắc tại sao file chỉ 85MB mà khi đọc file lại chiếm x10 bộ nhớ RAM?</p>



<p>Lý do là vì chúng ta đã đọc toàn bộ file và lưu đối tượng CSV trong bộ nhớ, khi làm như vậy thư viện CSV tạo ra rất nhiều đối tượng String, nên bộ nhớ sử dụng cao hơn nhiều so với kích thước thực tế của file CSV.</p>



<p>2. <strong>CSV.parse</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="require_relative './helpers'
require 'csv'

print_memory_usage do
  print_time_spent do
    content = File.read('data.csv')
    csv = CSV.parse(content, headers: true)
    sum = 0

    csv.each do |row|
      sum += row['id'].to_i
    end

    puts &quot;Sum: #{sum}&quot;
  end
end
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">require_relative</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">./helpers</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F286C4">require</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">csv</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">print_memory_usage </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">  print_time_spent </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">    content </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">File</span><span style="color: #F6F6F4">.read(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">data.csv</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    csv </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">CSV</span><span style="color: #F6F6F4">.parse(content, headers</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    sum </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    csv.each </span><span style="color: #F286C4">do</span><span style="color: #F6F6F4"> |row|</span></span>
<span class="line"><span style="color: #F6F6F4">      sum </span><span style="color: #F286C4">+=</span><span style="color: #F6F6F4"> row[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">id</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">].to_i</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">puts</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Sum: </span><span style="color: #F286C4">#{</span><span style="color: #E7EE98">sum</span><span style="color: #F286C4">}</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F286C4">end</span></span>
<span class="line"></span></code></pre></div>



<p>Kết quả:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="$ ruby parse2.rb
Sum: 499999500000
Time: 14.61
Memory: 1066.35 MB
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">$</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">ruby</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">parse2.rb</span></span>
<span class="line"><span style="color: #62E884">Sum:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">499999500000</span></span>
<span class="line"><span style="color: #62E884">Time:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">14.61</span></span>
<span class="line"><span style="color: #62E884">Memory:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1066.35</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">MB</span></span>
<span class="line"></span></code></pre></div>



<p>Cách này thậm chí còn tiêu tốn RAM hơn <strong>Cách 1</strong>, lý do là mình load toàn bộ dữ liệu từ file lưu vào biến (85MB), sau đó mới bắt đầu thực hiện các thao tác như <strong>Cách 1</strong>.</p>



<p>3. <strong>CSV.new</strong></p>



<p>Bây giờ chúng ta thử cách load toàn bộ file</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="require_relative './helpers'
require 'csv'

print_memory_usage do
  print_time_spent do
    content = File.read('data.csv')
    csv = CSV.new(content, headers: true)
    sum = 0

    while row = csv.shift
      sum += row['id'].to_i
    end

    puts &quot;Sum: #{sum}&quot;
  end
end
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">require_relative</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">./helpers</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F286C4">require</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">csv</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">print_memory_usage </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">  print_time_spent </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">    content </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">File</span><span style="color: #F6F6F4">.read(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">data.csv</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    csv </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">CSV</span><span style="color: #F6F6F4">.</span><span style="color: #F286C4">new</span><span style="color: #F6F6F4">(content, headers</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    sum </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">while</span><span style="color: #F6F6F4"> row </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> csv.shift</span></span>
<span class="line"><span style="color: #F6F6F4">      sum </span><span style="color: #F286C4">+=</span><span style="color: #F6F6F4"> row[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">id</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">].to_i</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">puts</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Sum: </span><span style="color: #F286C4">#{</span><span style="color: #E7EE98">sum</span><span style="color: #F286C4">}</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F286C4">end</span></span>
<span class="line"></span></code></pre></div>



<p>Kết quả:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="$ ruby parse3.rb
Sum: 499999500000
Time: 6.7
Memory: 170.19 MB
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">$</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">ruby</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">parse3.rb</span></span>
<span class="line"><span style="color: #62E884">Sum:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">499999500000</span></span>
<span class="line"><span style="color: #62E884">Time:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">6.7</span></span>
<span class="line"><span style="color: #62E884">Memory:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">170.19</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">MB</span></span>
<span class="line"></span></code></pre></div>



<p>Từ kết quả ta thấy lượng bộ nhớ sử dụng x2 kích thước của file (85 MB) vì nội dung file đã được nạp vào bộ nhớ. Thời gian xử lý nhanh hơn gấp đôi. </p>



<p>Phương pháp này hữu ích khi chúng ta đã có nội dung mà không cần đọc từ file, chỉ cần duyệt từng dòng. Việc lưu trực tiếp nội dung file vào bộ nhớ cho phép tăng tốc độ xử lý bằng cách loại bỏ quá trình đọc/ghi liên tục từ ổ đĩa.</p>



<p>Cách này được xem là cách tối ưu rồi, nhưng còn cách nào tốt hơn không? Cùng xem ví dụ ở dưới nhé.</p>



<p>4. <strong>IO read</strong></p>



<p>Ở đây chúng ta mở file, sau đó đọc từng dòng và parse sang CSV object</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="require_relative './helpers'
require 'csv'

# cách 1: bằng cơm
print_memory_usage do
  print_time_spent do
    File.open('data.csv', 'r') do |file|
      csv = CSV.new(file, headers: true)
      sum = 0

      while row = csv.shift
        sum += row['id'].to_i
      end

      puts &quot;Sum: #{sum}&quot;
    end
  end
end

# cách 2: dùng built-in của Ruby
print_memory_usage do
  print_time_spent do
    sum = 0

    CSV.foreach('data.csv', headers: true) do |row|
      sum += row['id'].to_i
    end

    puts &quot;Sum: #{sum}&quot;
  end
end
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">require_relative</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">./helpers</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F286C4">require</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">csv</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B"># cách 1: bằng cơm</span></span>
<span class="line"><span style="color: #F6F6F4">print_memory_usage </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">  print_time_spent </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1; font-style: italic">File</span><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">open</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">data.csv</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">r</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">do</span><span style="color: #F6F6F4"> |file|</span></span>
<span class="line"><span style="color: #F6F6F4">      csv </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">CSV</span><span style="color: #F6F6F4">.</span><span style="color: #F286C4">new</span><span style="color: #F6F6F4">(file, headers</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">      sum </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">while</span><span style="color: #F6F6F4"> row </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> csv.shift</span></span>
<span class="line"><span style="color: #F6F6F4">        sum </span><span style="color: #F286C4">+=</span><span style="color: #F6F6F4"> row[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">id</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">].to_i</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #97E1F1">puts</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Sum: </span><span style="color: #F286C4">#{</span><span style="color: #E7EE98">sum</span><span style="color: #F286C4">}</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F286C4">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B"># cách 2: dùng built-in của Ruby</span></span>
<span class="line"><span style="color: #F6F6F4">print_memory_usage </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">  print_time_spent </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">    sum </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1; font-style: italic">CSV</span><span style="color: #F6F6F4">.foreach(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">data.csv</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, headers</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">do</span><span style="color: #F6F6F4"> |row|</span></span>
<span class="line"><span style="color: #F6F6F4">      sum </span><span style="color: #F286C4">+=</span><span style="color: #F6F6F4"> row[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">id</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">].to_i</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">puts</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Sum: </span><span style="color: #F286C4">#{</span><span style="color: #E7EE98">sum</span><span style="color: #F286C4">}</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F286C4">end</span></span>
<span class="line"></span></code></pre></div>



<p>Kết quả:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="$ ruby parse4.rb
Sum: 499999500000
Time: 9.57
Memory: 0.72 MB
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">$</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">ruby</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">parse4.rb</span></span>
<span class="line"><span style="color: #62E884">Sum:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">499999500000</span></span>
<span class="line"><span style="color: #62E884">Time:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">9.57</span></span>
<span class="line"><span style="color: #62E884">Memory:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0.72</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">MB</span></span>
<span class="line"></span></code></pre></div>



<p>Á chà chà, cách này tiêu tốn rất ít RAM, nhưng đổi lại là tốc độ xử lý chậm hơn một tẹo <strong>Cách 3</strong> vì nhiều thao tác IO hơn.</p>



<h3 id="loi-ket" class="wp-block-heading">Lời kết</h3>



<p>Trong bài viết này, chúng ta đã thử nghiệm các cách để đọc file CSV và tìm ra cách tối ưu nhất từ góc nhìn tiêu thụ RAM và tốc độ xử lý. Chúng ta đã thấy rằng cách sử dụng <code>CSV.foreach</code> là cách <strong>tiết kiệm RAM nhất</strong>, dù tốc độ xử lý có chậm hơn so với cách sử dụng <code>CSV.new</code>. Tuy nhiên, tùy thuộc vào yêu cầu và tình huống cụ thể, chúng ta có thể lựa chọn phương pháp phù hợp để đạt được hiệu suất tối ưu. </p>



<p>Nếu chúng ta xử lý file CSV dung lượng lớn thì rõ ràng cách tiêu thụ ít RAM nhất là cách hiệu quả nhất bởi nó sẽ không gây tràn RAM gây crash hệ thống.</p>



<p></p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-xu-ly-csv-hieu-qua-trong-ruby/">Cách xử lý CSV hiệu quả trong Ruby</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/cach-xu-ly-csv-hieu-qua-trong-ruby/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Cách tạo swap file trên Ubuntu</title>
		<link>https://blog.tomosia.com.vn/cach-tao-swap-file-tren-ubuntu/</link>
					<comments>https://blog.tomosia.com.vn/cach-tao-swap-file-tren-ubuntu/#comments</comments>
		
		<dc:creator><![CDATA[Thâm Davies]]></dc:creator>
		<pubDate>Thu, 05 Oct 2023 06:27:54 +0000</pubDate>
				<category><![CDATA[Web Server]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=408</guid>

					<description><![CDATA[<p>Trước khi bắt đầu Swap không phải là sự thay thế cho bộ nhớ vật lý, nó là&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-tao-swap-file-tren-ubuntu/">Cách tạo swap file trên Ubuntu</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading" id="trước-khi-bắt-đầu"><span id="truoc-khi-bat-dau"><a href="https://www.thamdavies.com/blog/cach-tao-swap-file-tren-ubuntu#tr%C6%B0%E1%BB%9Bc-khi-b%E1%BA%AFt-%C4%91%E1%BA%A7u"></a>Trước khi bắt đầu</span></h3>



<p>Swap không phải là sự thay thế cho bộ nhớ vật lý, nó là một phần của ổ đĩa, chính vì thế nó có thời gian truy cập chậm hơn bộ nhớ vật lý. Nếu hệ thống của bạn liên tục hết bộ nhớ, bạn nên bổ sung thêm RAM.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Các thao tác của mình được thực hiện trên Ubuntu 20.04</p>
</blockquote>



<h3 class="wp-block-heading" id="tạo-một-swap-file"><span id="tao-mot-swap-file"><a href="https://www.thamdavies.com/blog/cach-tao-swap-file-tren-ubuntu#t%E1%BA%A1o-m%E1%BB%99t-swap-file"></a>Tạo một Swap File</span></h3>



<p>Tại sao chúng ta cần swap?</p>



<p>Có một tình huống hết sức cảm động như thế này. Bạn đang chạy một hệ thống săn voucher, trong các ngày bình thường thì lượng user truy cập không nhiều vì có voucher đâu mà săn 😛&nbsp;</p>



<p>Bỗng dưng tới ngày 12.12, hay các ngày số đẹp mà tiki hay lazada hay dụ các bạn vào hệ thống để săn sale ấy, thì lượng truy cập tăng đột biến và đây là cấu hình server của bạn,</p>



<ul class="wp-block-list">
<li>ổ cứng: 40GB</li>



<li>RAM: 2GB</li>
</ul>



<p>khiến cho RAM server của bạn ngỏm củ tỏi dẫn tới việc sập hệ thống. Tới đây các bạn đã thấy cảm động chưa 😅</p>



<p>Nguyên nhân sập hệ thống thì đã rõ, là do hết dung lượng RAM, vậy làm sao để giải quyết vấn đề này?</p>



<ul class="wp-block-list">
<li>Mua thêm 2GB RAM → 4GB</li>



<li><strong>Tận dụng swap space</strong>&nbsp;→ we are here, chúng ta sẽ mượn của ổ đĩa 2GB để tạo swap space, server sẽ sử dụng dung lượng mình đã swap này khi RAM đạt tới ngưỡng nhất định gọi là&nbsp;<strong>swappiness</strong>, mình sẽ nói ở phần dưới nhé.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Lưu ý đây là cách giải quyết tạm thời đề phòng server sập thôi nhé, đối với mình thì cách đầu tiên là ngon nhất, vì nó tận dụng tối đa sức mạnh của RAM</p>
</blockquote>



<p>Trong bài này, mình sẽ tạo swap file 2GB. Nếu bạn muốn tạo nhiều hơn thì thay 2G thành con số bạn mong muốn.</p>



<ol class="wp-block-list">
<li>Tạo swap file:</li>
</ol>



<pre class="wp-block-code"><code>sudo fallocate -l 2G /swapfile
</code></pre>



<ol class="wp-block-list" start="2">
<li>Set quyền cho file để user không nằm trong sudo không đọc và ghi file:</li>
</ol>



<pre class="wp-block-code"><code>sudo chmod 600 /swapfile
</code></pre>



<ol class="wp-block-list" start="3">
<li>Thiết lập swapfile dưới dạng vùng hoán đổi Linux:</li>
</ol>



<pre class="wp-block-code"><code>sudo mkswap /swapfile
</code></pre>



<p>Output</p>



<pre class="wp-block-code"><code>Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=fde7d2c8-06ea-400a-9027-fd731d8ab4c8
</code></pre>



<ol class="wp-block-list" start="4">
<li>Sau khi tạo thì enable nó lên để sử dụng nhé</li>
</ol>



<pre class="wp-block-code"><code>sudo swapon /swapfile
</code></pre>



<p>Để thực hiện thay đổi vĩnh viễn, hãy mở tệp&nbsp;<code>/etc/fstab</code>&nbsp;và thêm dòng sau:</p>



<pre class="wp-block-code"><code>/swapfile swap swap defaults 0 0
</code></pre>



<ol class="wp-block-list" start="5">
<li>Xác nhận swap file đã được enable hay chưa:</li>
</ol>



<pre class="wp-block-code"><code>sudo swapon --show
</code></pre>



<p>Output</p>



<pre class="wp-block-code"><code>NAME      TYPE      SIZE  USED PRIO
/swapfile file        2G    0B   -1
</code></pre>



<pre class="wp-block-code"><code>sudo free -h
</code></pre>



<p>Output</p>



<pre class="wp-block-code"><code>              total        used        free      shared  buff/cache   available
Mem:          981Mi        97Mi        68Mi       0.0Ki       814Mi       735Mi
Swap:         2.0Gi        10Mi       1.9Gi
</code></pre>



<h3 class="wp-block-heading" id="điều-chỉnh-giá-trị-swap---swappiness"><span id="dieu-chinh-gia-tri-swap-swappiness"><a href="https://www.thamdavies.com/blog/cach-tao-swap-file-tren-ubuntu#%C4%91i%E1%BB%81u-ch%E1%BB%89nh-gi%C3%A1-tr%E1%BB%8B-swap---swappiness"></a>Điều chỉnh giá trị swap &#8211; swappiness</span></h3>



<p>Swappiness cho phép chúng ta thiết lập thông số để Linux sử dụng swap space, trên Ubuntu giá trị này mặc định là 60, bạn kiểm tra bằng lệnh dưới đây:</p>



<pre class="wp-block-code"><code>cat /proc/sys/vm/swappiness
</code></pre>



<p>Vậy làm thế nào để sửa?</p>



<pre class="wp-block-code"><code>sudo vim /etc/sysctl.conf
# Sau đó thêm cuối dòng
vm.swappiness=90

# Chạy lệnh dưới đây để reload lại config ở trên nhé
sudo sysctl -p /etc/sysctl.conf
</code></pre>



<h3 class="wp-block-heading" id="xoá-swap-file"><span id="xoa-swap-file"><a href="https://www.thamdavies.com/blog/cach-tao-swap-file-tren-ubuntu#xo%C3%A1-swap-file"></a>Xoá swap file</span></h3>



<pre class="wp-block-code"><code>sudo swapoff -v /swapfile
sudo rm /swapfile
</code></pre>



<h3 class="wp-block-heading" id="-lời-cảm-ơn"><span id="%f0%9f%92%8c-loi-cam-on"><a href="https://www.thamdavies.com/blog/cach-tao-swap-file-tren-ubuntu#-l%E1%BB%9Di-c%E1%BA%A3m-%C6%A1n"></a>💌 Lời cảm ơn</span></h3>



<p>Cảm ơn các bạn đã theo dõi hết bài 😍. Trên đây là toàn bộ những gì chưa sẻ về&nbsp;<strong>Cách tạo swap file trên Ubuntu</strong>&nbsp;hy vọng nó giúp bạn phần nào trong hành trình code của bạn. 💪</p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-tao-swap-file-tren-ubuntu/">Cách tạo swap file trên Ubuntu</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/cach-tao-swap-file-tren-ubuntu/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
